摘要: 在学习《大规模web服务开发》的过程中了解到了后缀数组这一数据结构的应用。书上说得不是很清楚,于是决定自己研究下。网上研究后缀数组的资料很多,可以参考Juha K¨arkk¨ainen, Peter Sanders的《Sorting Strings and Suffixes》。先说字符串排序吧。字符串排序一般方法是容易想到的,如套用冒泡或快排,将字符串的比较操作等价于数字的比较操作,假设字符串平均长度为L,则在套用随机化快排进行字符串排序的情况下平均时间复杂度为O(L*NlogN)。很慢对不对?使用MSD Radix Sort可以大幅提高算法的效率,对于constant a 阅读全文
posted @ 2012-11-15 16:41 woodlgz 阅读(681) 评论(0) 推荐(0)
摘要: 昨天晚上和朋友讨论面试题目,讲到字节对齐的题目。对于字节对齐以前了解过,但是昨晚一翻讨论下来发现自己以前的理解还不够到位。于是有花时间又研究了下。于是有了本随笔,仅做备忘。(1)首先需要知道对齐模数这个概念,在32位windows平台类型 char short int long float double 对齐模数 1 2 4 4 4 8 在32位linux平台 类型 char short int long float double对齐模数 1 2 4 4 4 4(2)其次需要知道#pragma pack(n),编译选项。不妨把n称为额定对齐模数。 这个编译选项... 阅读全文
posted @ 2012-05-02 11:17 woodlgz 阅读(282) 评论(0) 推荐(0)
摘要: 上次提出的问题是如何在在插入N个数的情况下使算法复杂度更低。O(N^2)的解法是容易想到的,那么如何改进呢?由于每次插入总是要找到一个最大区间,所以时间久耗费在这里了。上次给出的解法由于是在每次插入都维护一个有序链表,在有N个元素在链表的情况下,要找最大区间算法复杂度为O(N)。需要改进的地方就在这里了。改进思路是,寻找一种方法使得每次插入后总是能直接获得一个最大区间,或者说插入后,维护最大区间的复杂度要少于O(N).好吧。我的优化解法是维护一个大顶堆。每次有新数据的插入必定改变一个区间的同时产生两个新的区间,而原来的最大区间不复存在。在原来大顶堆的节点数为N的情况下,堆顶是最大区间,插入后, 阅读全文
posted @ 2012-04-22 20:26 woodlgz 阅读(406) 评论(0) 推荐(0)
摘要: 设初始区间为seq0 [0.0,1,0],产生一个随机数插入原来区间形成新区间seq1(假设产生0.7,则seq1=[0.0,0.7,1.0])。对seq1中的区间的子相邻区间(如[0.0,0.7]和[0.7,1.0])取最大值,再次在此区间产生随机数并插入...如此不断重复。算法很简单,维护一个链表即可。每产生一个数所需的时间复杂度O(N),直接上代码(有优化余地):#include <stdio.h>#include <stdlib.h>typedef struct TagNode{ float data; struct TagNode* next;} Node,* 阅读全文
posted @ 2012-04-20 17:58 woodlgz 阅读(224) 评论(0) 推荐(0)