飞纯技术
  • 主页
  • 相册
  • 关于我
KEEP IN TOUCH

Posts in category 算法

数据结构总结-堆

十14
2007
2 Comments Written by Filia.Tao

堆结构是一类很重要的数据结构,特别是在实现优先队列方面。
堆结构实际上都是树(或森林),不过按节点的存储方式又可以分为两种

  1. 顺序存储
    这种情况下,必须保持是完全树。 (在插入,删除后及时调整)
    可以通过下标运算找到父节点,字节点。
  2. 链接存储
    如果是二叉树,一般就用LeftChild,RightChild 两个指针。
    否则一般用环链表表示一个 节点的子女。

下面的表格在blog 中显得很拥挤,建议在这里查看.


数据结构 存储方式 定义与性质 支持的操作 及 复杂度(分摊)
最大堆 顺序存储 完全二叉树,最大树 插入
O(log n)
删除最大元素 O(log n)
最小最大堆 顺序存储 完全二叉树,树的各层交替为最小层和最大层 插入
O(log n)
删除最大元素 O(log n)
删除最小元素 O(log n)
双堆 顺序存储 完全二叉树
或者为空,或者同时满足:
1.根结点不含元素
2.左子树是最小堆
3.右子树为最大堆
4.若右子树不为空,设i 为左子树中的任意结点,
j为右子树的对应结点.
若j不存在,则令j为右子树中对应i的父结点的结点。
必有结点i的key 小于 结点j的key值
插入
O(log n)
删除最大元素 O(log n)
删除最小元素 O(log n)
左偏树
(最小/最大)
链接存储 1.是左偏树
每一个内部结点x 有
shortest(LeftChild(x))
>=shortes(RightChild(x))
2.是最小/最大树
插入
O(log n)
删除最小/最大元素 O(log n)
合并 O(log n)
二项式堆
(最小/最大)
链接存储 最小/最大二项式树的集合.
度为k的二项式树(记作Bk)定义为:
若k=0,该树只有1个结点.
若k>0,该树的根的度为k,其子树为B0,B1,…..,Bk-1
插入 O(1)
删除最小/最大元素 O(log n)
合并 O(1)
斐波纳契堆
(最小/最大)
链接存储 最小/最大树的集合.
二项式堆是斐波纳契堆的特殊情况.
使用双环链表,并在结点中加入parent和childcut.
关键是瀑布修剪
插入 O(1)
删除最小/最大元素 O(log n)
合并 O(1)
减少指定结点key值
O(1)
删除指定结点元素
O(log n)
Posted in 计算机科学 - Tagged heap, 堆, 数据结构

Find the Array

九13
2007
1 Comment Written by Filia.Tao

接着做题.原题在这里 Find the Array.

草草的翻译一下就是

有一个原始数组o[1..n], 1..n的一个排列. 另有一个数组, g[1..n] , g[i] 表示在o[i+1..n] 中比 o[i] 小的数的数目. 给定g 求 o .

问题上挺简单的.我的解答如下:

the given array g[1..n]
the original  array o[1..n]

let i = the index of first 0 in g then o[i] = 1
for j =1 to i
     g[i] = g[i] -1
again , let i = the index of first 0 in g , then o[i] = 2

repeat the steps utils find all the element.

我的这个算法时间复杂度为 2n + 2(n -1) + 2(n -2)+ 2(n-3) + ….. 2 * 1 =O(n**2)
很不好.. 网站是说有nlogn 的方法, 我想不出来….
这个算法实际上和counting sort 有一些类似.
更抽象一点的话, 都是用某一种数据结构来保存了次序信息. (昨天BBS 上有人讨论胜者树, 也是一种保存次序信息的数据结构).

Missing Number – New version

九12
2007
Leave a Comment Written by Filia.Tao

今天开始做题,第一个题目, Missing Number – New version .
发现我竟然在很短的时间内就想到了思路. 题目摘录如下:

An array A[1...n] contains all the integers from 0 to n except one. In this problem, we cannot access an entire integer in A with a single operation. The elements of A are represented in binary, and the only operation we can use to access them is “fetch the jth bit of A[i ]“, which takes constant time. Find the missing integer in O(n) time.

翻译成中文就是, 数组A[1..n] 包含 0-n 中的n-1个数, 只有一个不在里面. 数字以二进制存储,一次只能访问一位. (常数时间) . 现在要求在O(n)时间内找到不在其中的那个数.

下面是答案, 不想看答案的可以停止阅了.
————————————————

首先, 我们假设n =2k . (假设的合理性, 下面讨论) , 用k 位二进制数来表示一个数.
很显然所有数中i-th 位 会有n/2 个1 ,n/2 个 0.

init array T with 1..n
m = n-1
for i =1 to k
    for j = 1 to m
        B  =  []
        C  =  []
        if i-th-bit(A[j]) == 1
           Add j to B
        else
           Add j to C
    if size(B) < size(C)
         T = B
    else
         T = C
    m = floor(m/2)

Now T should only have one element k,
toogle last bit of A[k] is the missing number .

算法分析:
复杂度为 : n + n/2 + n/4 + n/8 + ……… + 2 + 1 < 2n = O(n)
不过使用了一些多余的存储空间.
另:n =2k假设的合理性.
if 2k-1 < n < 2k , 我们完全可以不管第一位, 因为它必定为1. (使用K位编码)
所以 T(n) = T(2k-1)

Posted in 计算机科学 - Tagged 计算机科学

算法导论-MIT

七20
2007
3 Comments Written by Filia.Tao

这几天我在看MIT 的算法导论的视频(RM),课件(PDF),电子书(CHM),,Homework (PDF) 等等。
一整套的东西。
视频实际上就是MIT自己上课的录像。我发现

  • 我竟然能够听懂上课的英语。 个别单词不懂,猜一下就知道了。
  • 看课件一个讲座也就30-40分钟就看完了。 时间上一个讲座一般要75分钟。还是听课的效果比较好。 看课件不容易集中注意力,而且思路没有听课清晰。
  • MIT 的学生也有上课迟到。。。
  • 我的算法不行啊。。 得补一下。。

看完前两讲,明天把Homework做一下。。

    Tagged MIT, 算法导论

    推荐《如何求解问题》这本书

    四19
    2007
    Leave a Comment Written by Filia.Tao

    最近在看如何求解问题这本书 .刚从图书馆借的时候是因为里面有很多有趣的题目.
    现在我是把它作为人工智能课的补充读物的. 这本书的主题是启发式方法,但并不拘泥于具体的算法.

    作者写道:

    总之,本书最重要的一点是 ,一个人在求解问题时,既要广泛的了解一些可用的工具和算法,同时也应该掌握一些求解问题的技巧(这与其说是一门科学,不如说更是一门艺术.)

    这本书非常有趣味性. 如果没有兴趣看其中的算法, 仅仅看没一章前面的难题,也是一件非常有趣的事情.
    强烈推荐这本书.

    Tagged 启发式

    授权方式

    Creative Commons License
    本站作品采用
    知识共享署名-非商业性使用-相同方式共享 3.0 许可协议
    进行许可。

    最近评论

    • carlos 发表在《yacc,ast and graphviz》
    • xiang 发表在《关于我》
    • healthy green tea 发表在《debian 同步系统时间》
    • Filia.Tao 发表在《Kinper – A Kindle Helper Service》
    • pensz 发表在《厦门行简单记录》

    My Tweets

    RSS My KnowHowSpot

    标签

    指令 汇编 算法 计算机科学 2008 amazon android ast boto C++ C/C++ compiler Computer design-pattern DFA Django ezengage Firefox github google GSoc http imagedownload iterator javascript jquery kindle kinper lex life Linux locationbar Mix opensource proxy python s3 S5Creator shanghai slide STL vector vista web Web开发

    分类

    • ideas (2)
    • job (2)
    • life (2)
    • notes (1)
    • opensource (38)
      • Firefox (17)
      • GSoc (7)
      • Linux (13)
    • project (3)
    • 生活 (3)
    • 编程开发 (67)
      • C/C++ (4)
      • GAE (1)
      • http (2)
      • javascript (24)
      • python (20)
      • Web开发 (12)
      • 端口映射工具的实现 (6)
    • 计算机科学 (23)
      • compiler (17)
        • lex (11)
      • 算法 (5)
    • 随便写写 (67)

    文章归档

    Blogroll

    • 11′s SKY
    • 86's world
    • Filia’s Summer Of Code
    • limodou的学习记录
    • Loki
    • MyAllBlue
    • perol’s blog
    • Realazy
    • 一个藏袍
    • 人猿星球
    • 冰古Blog
    • 刀枪Blue
    • 懶懶喵日記
    • 桑林志
    • 白菜
    • 车东[Blog^2]
    • 释翼的天空
    • 阿文的自留地

    开源网站

    • beagle
    • linuxsir
    • sourceforge
    • 中国Linux 公社
    • 啄木鸟社区

    我的项目

    • ezEngage
    • KnowHowSpot

    EvoLve theme by Theme4Press  •  Powered by WordPress 飞纯技术