2013年3月24日

原地排序-更简洁的算法

摘要: 在我以前的这篇文章中:原地排序与链表翻转解决这个问题是先把链表翻转,然后再循环左移,原理是清楚了,可是稍显繁琐。这里有更简单的解法:void rearrange(KeyVal* a, int n) { for (int i = 0; i next = p->next->next,这是一个删除链表结点的操作!swap(a[i], a[j]) 实际上是将 a[j] 从 j 所属的那个大环状链表中删除!该算法的本质是:每次碰到一个结点,就将该结点的后继结点从循环链表中删除,删除的同时,被删除的那个结点就归位了。 阅读全文

posted @ 2013-03-24 19:24 能发波 阅读(272) 评论(0) 推荐(0) 编辑

字符串匹配中的图论

摘要: 问题有一个字符串由多个变量拼接而成: "$x1$x2$x3$x4$x5$x6..." ,这个列表可以一直延伸到 $x10000,而每个变量都至少有一种可能的取值,为了简化问题,每个变量不会再引用别的变量。现在,给定一个字符串T,判断这个字符串是否能由上面这个"$x1$x2$x3$x4$x5$x6..." 生成。分析我们可以算出,总的可能性(最多)是 n1*n2*n3*n4*n5*n6...。最笨的办法因为现实中不会有太极端的情况,我们可以将这些字符串全部扩展出来,放入一个hash table。但是,如何得到这些扩展结果呢?这是一个笛卡尔积的问题,可以用最 阅读全文

posted @ 2013-03-24 10:51 能发波 阅读(198) 评论(0) 推荐(0) 编辑

导航