
算法
Preke
这个作者很懒,什么都没留下…
展开
-
散列表
当实际存储的关键字数目比全部的可能关键字总数要小时,采用散列表就能成为直接数组寻址的一种有效替代,因为散列表使用一个长度与实际存储的关键字数目成比例的数组来存储。解决冲突:链接(chaining)在有冲突的槽里用一条链表存储数据,槽内存链表的头指针; 无论成功与否,查找一个元素的复杂度为O(1+a)O(1+a), 其中a为每个槽内存储元素的个数的期望 (找不到的标志:槽为空,或者槽指向的链表遍历原创 2016-08-19 19:38:25 · 443 阅读 · 0 评论 -
红黑树
性质:红黑树是一棵二叉搜索树,他在每个结点上增加了一个存储位为来标识结点的颜色,可以是RED或者BLACK。通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,保证没有一条路径比其他路径长出2倍,所以是近似平衡的。 每个节点是红色或者黑色 根节点是黑色 每个叶节点(NULL)是黑色的 如果一个节点是红色的,则它的两个子节点都是黑色的 对于每个结点,从该结点到其所有后原创 2016-08-24 02:28:07 · 1850 阅读 · 2 评论 -
最大子数组(maximum subarray)问题
1. 分治策略:数组a(长度为n)的最大子数组为: 1. a[0]到a[n/2]的最大子数组; 2. a[n/2+1]到a[n-1]的最大子数组; 3. a[i]到a[j],其中i <= n/2 <= j;定义一个结构体承载返回结果:typedef struct max_sub_array{ int low; int high; int sum; max_sub_原创 2016-08-12 21:43:48 · 626 阅读 · 0 评论 -
快速排序
有两个版本,主要是Partition的思路不同,分别实现: 1. 《算法导论》的版本: 就是Partition时,比较的时候,主元的位置不变,只是在前面扫过一次,把比主元大的放在后面,比主元小的放在前面。这样的复杂度一看很明显就是 O(nlog(n))O(nlog(n))int Partition(int* a, int low, int high) { int pivot = a[h原创 2016-08-14 11:30:57 · 347 阅读 · 0 评论 -
堆排序(Heapsort)
复杂度:O(nlog(n))O(nlog(n)) 堆是一个数组,可以看做近似的完全二叉树; 对于给定的下标 i : 父节点的下标:i/2 左子节点的下标:2i 右子节点的下标:2i+1最大堆:除了根以外的结点满足:a[Parent(i)] >= a[i]维护堆的性质: 宏定义:# define PARENT(i) (i/2)# define LEFT(i) (2*i)原创 2016-08-13 02:57:43 · 427 阅读 · 0 评论