数据结构与算法
文章平均质量分 66
随心而动随意而行
time waits no man
展开
-
链表
1.构造链表2.逆序打印链表 实现方法: a.用stack实现 b.用递归实现 测试用例: 没有节点,只有一个节点,有多个节点3.在O(1)时间删除节点 实现方法: 复制被删除节点的下一个节点,然后删除next节点 测试用例: nul原创 2013-12-07 20:15:12 · 671 阅读 · 0 评论 -
内存分配-----伙伴算法和slab算法
内存管理问题:内存碎片大小和管理内存碎片的效率问题(即空间和时间效率的问题):内存碎片是指当回收一块内存时,一般将内存直接放入free链表中,由于内存越分配越小,内存块就会特别多而且特别小,当需要一块大的内存块的时候无法找到.原因就在于回收内存的时候,不能把相邻两块可用内存合并.解决方法:1.小块内存单独分配,大块内存有系统自动分配.(nginx和stl就是使用这种方法)2.伙原创 2014-01-02 09:39:03 · 15991 阅读 · 0 评论 -
二叉树的9种遍历
这里着重讲解一下非递归不用栈遍历二叉树: 我们先回忆一下递归遍历二叉树.在递归遍历二叉树的时候,我们使用系统栈做临时存储空间,记录节点的后继节点以便下一次查找.所以递归遍历所用的系统栈空间为O(h),h为二叉树的深度.一般情况下二叉树深度为lg(n),即二叉树遍历的空间复杂度为O(lg(n)),当二叉树的深度退化为n时候,即二叉树退化为链表时候,空间复杂度猛增为O(n).原创 2013-12-14 16:40:25 · 748 阅读 · 0 评论 -
把搜索二叉树转换成双向链表
题目来自>,这个是本人的代码,和原书不一样.思想:利用中序遍历中的递归思路,先转换左子树,然后转换右子树,然后就转换完成.这里关键点是传入一个前驱指针,用于和当前节点的连接.代码://这里要特别注意一点:prev的值必须有指向,即不能为空,否则,会造成值传递,从而错误.//其实这里改成指针的引用比较好.//void convert(BST_node *pRoot,BST_node*原创 2013-12-14 21:05:06 · 701 阅读 · 0 评论 -
各种排序比较
#include using namespace std;typedef const int& itemType ;typedef bool (*cmp)( itemType a, itemType b);bool myless(const int& a,const int& b){ return a<b;}template void myswap(T& a,T&原创 2013-12-12 23:38:46 · 650 阅读 · 0 评论 -
A*算法 和 IDA*算法
A*算法概述: 采用广度优先搜索策略,在搜索过程中使用启发函数,即有大致方向的向前进虽然目标有时候不是很明确。A*算法核心: A*算法的关键在于启发函数,启发函数的优劣直接影响A*算法的效率。 f(n)=g(n)+h(n); 这个式子中:f(n)表示从初始状态到目标状态的估测代价。原创 2013-12-05 14:41:02 · 11896 阅读 · 0 评论 -
康托展开式
格式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0!康托展开式用途: 1:康托展开式是一个全排列到自然数的双射(两个集合之间一一对应),常用于构建Hash表时候的时空压缩。 2:康托展开式可用于计算当前按某一全序关系全排列中的位置,因此可逆。对于第一条不多加解释,现在着重解释第二条。这原创 2013-12-02 10:07:03 · 1113 阅读 · 0 评论 -
hash函数
由于本人水平有限,文章中难免有错误,望请指出,万分感谢。 思想:利用映射技术,将目标数据映射到某一个地址,且该地址可以进行直接定位。 映射技术实现的方法: 除法散列:h(k) = k mod m ; m一般为与2的幂不太接近的质数。原因:当m以2的幂结尾时,余数为k除以2的幂的位数,这样产生冲突的概率加大原创 2013-12-01 18:46:15 · 789 阅读 · 0 评论 -
剖析ngx_queue
由于本人水平有限,文章中难免会有错误,还望指正,不胜感激.nginx双向链表特点: 1.其数据结构仅有两个指针 prev和next 2.不分配内存空间 3.操作简单,仅仅移动指针的前后指向 4.可以链接不同的数据,只要数据中包含queue这种数据成员先来张图:这里的哨兵指的是 :原创 2013-12-08 21:35:13 · 845 阅读 · 0 评论 -
寻找素数
教学方法:1.检测每一个是不是素数.#includeusingnamespace std; boolisPrimer(int x){ for (int i=2; i*i<=x; ++i){ if ( x%i ==0 ){ return false; } } return true;} int ma原创 2014-02-04 12:55:10 · 593 阅读 · 0 评论