数据结构与算法
文章平均质量分 68
zero_lee
这个作者很懒,什么都没留下…
展开
-
glib中GTrashStack小计
GTrashStack中只有一个成员,是一个指针,也是一个指向stack前一片内存的指针。struct GTrashStack { GTrashStack *next;}; 在回收内存时,这样的结构不会带来额外的内存开销,因为可以将next指针记录在回收的内存中。G_INLINE_FUNC voidg_trash_stack_push (GTrashStack **sta原创 2012-08-14 13:37:01 · 966 阅读 · 0 评论 -
[Happy DSA] rope算法学习
rope是粗绳索的意思,在计算机编程世界里,它可以替代string来处理超长字符串的相关操作,比如联接,插入,删除,因此它常用于text editor这样的应用中。它的wiki主页简要描述了它的机理:这个算法来源于一篇paper: Boehm, Hans-J; Atkinson, Russ; and Plass, Michael (December 1995).Ropes: an Al原创 2012-08-14 13:38:45 · 3218 阅读 · 0 评论 -
[Happy DSA] 求解最长回文子字符串
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串google,由于该字符串里最长的对称子字符串是goog,因此输出4关于这个问题,有一个比较好的线性时间复杂度的算法Manacher's ALGORITHM这2篇技术博客非常好的阐述了它的算法思想:1) http://www.felix021.com/blog/read.php?2040 (中文原创 2012-12-23 17:30:50 · 636 阅读 · 0 评论 -
[Happy DSA] Print all interleavings of given two strings
Given two strings str1 and str2, write a function that prints all interleavings of the given two strings. You may assume that all characters in both strings are differentExample:Input: str1原创 2013-01-05 19:09:00 · 607 阅读 · 0 评论 -
[Effective DSA] 链表的反转
这里的链表为单向链表和双向链表:单向链表的反转单向链表的反转,只需要维护1个节点指针,每次只能反转一个节点指向。GLIB的代码如下:(充分利用传入进来的list)GSList*g_slist_reverse (GSList *list){ GSList *prev = NULL; while (list) { GSList *next = lis原创 2012-08-14 13:28:25 · 673 阅读 · 0 评论 -
[Happy DSA] 2个浮点数的最大公约数的算法小结
我们知道2个整数有最大公约数(GCD)和最小公倍数(LCM)的说法。而且最大公约数GCD有一个公认的欧拉算法GCD。它的算法如下:GCD(a, b) { return b ? GCD(b, a % b) : a;}有了GCD,当然也很好求解LCM。现在,问题来了,给定2个浮点数,怎么求解它们的GCD?1. 数学上的方法一个比较的想法就是,既然我们已有的工原创 2012-10-30 22:32:25 · 1381 阅读 · 0 评论 -
[Happy DSA] 程序实现绘制箭头的原理
下图演示了如何给一条线段画上箭头的实现原理,主要也就是如何旋转一个向量。其中rotation angle和scale都可以在程序代码中自定义。原创 2012-08-15 10:20:39 · 693 阅读 · 0 评论 -
[Happy DSA] 图像的contour trace算法C++实现
问题提出:给定一个二维图像,基于某个threshold,来提取contours。在图形图像学中,这个问题有比较好的解决方案,google "coutour trace",可以得到以下2个比较好的参考文献:1. http://en.wikipedia.org/wiki/Moore_neighborhood2. http://www.imageprocessingplace.com/d原创 2012-10-15 16:21:57 · 4850 阅读 · 7 评论 -
[Happy DSA] 求解直方图下的最大矩形面积
问题描述:比较给定直方图对应的值列表为[1, 2, 4, 2, 1],那么最大的矩形面积应该是[2, 4, 2]描述的区间矩形面积为6(宽度为3,高度为2)。关于这个问题,网上有比较多的解决方案,时间复杂度从O(n^2)、O(nlgn),到O(n) (需O(n)空间)。http://blog.csdn.net/arbuckle/article/details/710988原创 2012-12-22 22:21:11 · 1148 阅读 · 0 评论 -
[Happy DSA] 2D平面上n个点,求解最接近45度的2点连线
有这么一个几何问题:2d平面的n个点,怎么求解连线最接近45度的那些点的组合。1. 朴素方法:我们能想到的最naitive的方法就是求解平面上所有2点连线的斜率,斜率的绝对值最接近于1的那些点的组合,就是我们想要的。要知道n个点能构成n^2条线段,故这种方法的时间复杂度就是O(n^2)。但是我们期望有更好的,时间复杂度较小的解决方法。2. 一个比较好的方法如果熟悉计原创 2012-11-25 23:09:56 · 900 阅读 · 0 评论 -
[Happy Coding] 一段调用STL算法的程序代码的效率分析
已知一个STD::SET,想要根据一个predicate来从中去除所有的满足predicate(返回true)的元素。我们首先想到的是STL提供的remove_if函数。下面我们来看看这个函数是如何实现的:1133 template1134 _ForwardIterator1135 remove_if(_ForwardIterator __fir原创 2012-10-24 19:41:05 · 872 阅读 · 0 评论 -
[Happy DSA] 将已排序的元素序列快速的插入到stl set中
已知一个从小到大已排序的元素序列,如何插入到stl set中最快。1. stl set内部结构我们知道stl set内部是用红黑树来实现的。红黑树是一种平衡二叉查找树,它有以下4个用来平衡的条件:每个节点要么是红色,要么是黑色根节点为黑色红节点的子节点一定是黑色任一个节点至页节点的任何路径上,黑节点的个数相等所以当插入一个新的非根节点时,它一定要是红色,是为了不破坏原创 2012-11-25 21:52:37 · 1029 阅读 · 0 评论 -
glib中单双向链表的归并排序
在glib库中,双向链表的排序是采用合并排序的方法,但它并不是两两的合并,而是迭代的合并,如下图:代码如下:GList *g_list_sort (GList *list, GCompareFunc compare_func){ return g_list_sort_real (list, (GFunc) compare_func, NU原创 2012-08-14 13:31:34 · 2046 阅读 · 0 评论 -
glib中的GQueue结构体
glib库的GQueue的实现,是依托在GList的基础上:内部保存有哪个双向队列的头和尾,故可以提供一些双向队列的接口,例如push_head, push_tail, pop_head, pop_tail。有一个印象深刻的函数实现:GList *g_queue_peek_nth_link (GQueue *queue, guint n){原创 2012-08-14 13:32:45 · 2406 阅读 · 0 评论 -
[Happy DSA] 如何对单链表进行快速排序
通常快速排序算法都是施行于数组,但它也可以作用于单链表。原理跟数组快速排序是一样的,先partition,然后再递归的解决子单链表的快速排序。以下是从c-algorithms代码中摘下来的代码段:static SListEntry *slist_sort_internal(SListEntry **list,原创 2013-11-12 10:54:39 · 1134 阅读 · 0 评论