摘要: 任何比较排序在最好情况下都要经过Ω(nlgn),即比较排序的下界为Ω(nlgn)。 合并排序和堆排序都是渐进最优的。 要突破Ω(nlgn),就要进行非比较排序。计数排序、基数排序和桶排序都有非比较的一些操作来确定排序顺序,它们可以达到线性运行时间。 计数排序法: 计数排序的基本思想是对每一个输入元素 阅读全文
posted @ 2018-02-05 23:03 jackson_zhou 阅读(97) 评论(0) 推荐(0)
摘要: 快速排序是用于排序的最佳使用选择,这是因为其平均性能相当好,期望运行时间是O(nlgn),且记号中隐藏的常数因子很小。另外:它还能够进行就地排序。 快速排序是基于分治模型的: 为排序一个完整的数组A,最初的调用是quicksort(A, 0, __count_of(A) ) 快排算法的关键是PART 阅读全文
posted @ 2018-02-05 16:26 jackson_zhou 阅读(122) 评论(0) 推荐(0)
摘要: 堆排序结合了插入排序和归并排序的有点:它空间复杂度是O(1), 时间复杂度是O(nlgn). 要讲堆排序,先讲数据结构“堆” 堆: 堆是用数组来存放一个完全二叉树的数据结构。假设数组名是A,树的根节点存放在A[1]。它的左孩子存放在A[2],右孩子存放在A[3] 即:对于某个下标位i的节点,它的左孩 阅读全文
posted @ 2018-01-23 21:09 jackson_zhou 阅读(304) 评论(0) 推荐(0)
摘要: 分治策略:将原问题划分成n个规模较小而结构与原问题相似的子问题,然后递归地解决这些子问题,最后再合并其结果,就可以得到原问题的解。 它需要三个步骤: 通过分治策略和分治步骤,可以简单地默出归并算法。 书上的变量q、p、r太难理解,改为了left, middle(m), right。分别代表数组的左起 阅读全文
posted @ 2018-01-20 23:42 jackson_zhou 阅读(251) 评论(0) 推荐(0)
摘要: 本章的重点是循环不变式。也就是在一个循环中存在着某些不变的量。它类似于数学归纳法的归纳步骤: 我们在设计一个算法、分析一个算法的时候,要适当应用循环不变式来简化分析工作、证明算法的正确性。 书中举例插入排序: n个元素的待排序数组A,下标是从1到n。 j从2开始一直遍历到大于n(此时会退出循环)。循 阅读全文
posted @ 2018-01-20 23:12 jackson_zhou 阅读(249) 评论(0) 推荐(0)
摘要: 我是linux ,在我的电脑中,vector的代码位于/usr/include/c++/4.4.4/bits/stl_vector.h, vector.tcc 先概括细节: vector的实现是 它在stl_vector.h 中定义了一个 _Vector_impl的三个对象分别是数组的起始地址_M_ 阅读全文
posted @ 2017-12-15 19:14 jackson_zhou 阅读(157) 评论(0) 推荐(0)
摘要: #include #include #include #include "dict.h" int dictSdsKeyCaseCompare(void *privdata, const void *key1, const void *key2) { return strcasecmp(key1, key2) == 0; } unsigned int dictSdsCaseHash(... 阅读全文
posted @ 2017-12-15 17:02 jackson_zhou 阅读(160) 评论(0) 推荐(0)
摘要: Redis是用C语言编写的。C语言处理字符串一向是个难点。很容易出现内存越界问题。 其它高级语言很容易实现的字符串拼接,在C这里却是百般艰难。因为需要实现计算出字符串所占内存的大小。即不能过大(浪费内存),也不能太小(越界)。甚至在某个用C语言实现的项目中出现了这样的代码 即,先计算出字符串的大小。 阅读全文
posted @ 2017-12-09 19:35 jackson_zhou 阅读(269) 评论(0) 推荐(0)
摘要: 源代码获取 git clone https://github.com/antirez/redis.git 读代码之前,要先明白Redis是什么?它的整体结构是什么?这样读代码才不至于盲目。在对软件不太了解的前提下,想通过读源代码来熟悉它是件很困难的事。 但反过来,已知软件的功能,回过头来找找它是怎么 阅读全文
posted @ 2017-12-09 18:49 jackson_zhou 阅读(255) 评论(0) 推荐(0)