《数据结构与算法分析》阅读札记

《数据结构与算法分析》阅读札记

     总体来说,这是本简约而不简单的书。本书的特色在于每讲解完一种数据结构后给出了该数据结构的一些应用;排序一章的讲解尤为精彩;之于算法部分,则略显单薄,想另外参考CLRS。

     本书开篇提出的问题很有意思:如何寻找N个数中的第k个最大者。解决方法一是将N个数放入一个数组递减排序,然后返回位置k上的元素;解决方法二是先把前k个元素读入数组并递减排序,接着再将剩下的元素逐个读入,读入时若小于数组第k个元素则忽略,否则将其放到正确位置并挤出数组中最小的元素。但这两种方法在大规模输入中消耗时间很长,并不理想。  

     关于数据结构的应用

     链表:多项式——两个多项式的加法、乘法

             基数排序——桶排序的推广,即多趟桶排序,从数的最低有效位开始

             多重表

     :平衡符号——用于检验符号是否成对出现(如“[()]”)

           后缀表达式——逆波兰记法

           函数调用——调用函数时,需存储主调例程的所有局部变量、当前位置(返回地址),这些工作都可由一个栈来完成;尾递归

     队列:打印机、图论

     二叉树:二叉查找树——树中每个节点的左子树关键字小于该节点关键字,右子树关键字则大于该节点关键字

     散列表(hash table):散列函数选择方法

                                     解决散列值冲突方法——分离链接法(将散列到同一个值的所有元素保留到一个表中,需要指针,速度减慢)、开放定址法(如果有冲突发生,就尝试选择另外的  单元,直到找到空的单元为止,包括线性探测法(F(i)=i)、平方探测法(F(i)=i^2)、双散列(F(i)=i*hash'(X)))

     优先队列(堆):选择问题(即本书开篇所提到的选择第k大元素问题)——a.将N个元素读入数组,然后对其构造堆,最后执行k次删除最小值操作便可得第k小的数,变换堆的性质同理可得第k大的元素。该方法构造堆得最坏情形用时O(N),每次删除用时O(logN),总运行时间为O(N+klogN),如果k=O(N/logN),则运行时间取决于构造堆操作,即O(N),对于大于k的值,运行时间为O(klogN)。

                                                                                                     b.利用开篇所提供的第二个算法,用一个堆来实现初始的k个元素。前k个元素通过调用一次构造堆以总时间O(k)置入堆,处理其余每个元素的时间为O(1)(检测元素是否进入堆)再加上时间O(logk)(有必要时删除其中元素并插入新元素),因此总时间为O(k+(N-k)logk)=O(Nlogk)。

                            事件模拟

     排序

     插入排序:原地排序、O(N^2)

     希尔排序(缩小增量序列排序):增量序列、O(N^2)

     堆排序

     归并排序

     快速排序

     桶式排序:特殊情况下(输入数据小于M,构造M个桶)以线性时间进行排序

     外部排序:处理大输入,无需将输入数据都装入内存。中心思想是合并,多路合并、多相合并

     以上主要是数据结构及排序,算法方面需继续啃CLRS。

你可能感兴趣的:(数据结构与算法)