俊介三

一天更新一点,一天积累一点

导航

随笔分类 -  Data Structure

摘要:在计算机科学中,trie,又称前缀树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。参考资料:维基百科 Trie树详解应用场景:字符串精确搜索。代码:#include <iostream>#include <cstdio>#include <cstring>#define BRANCHNUM 26using n 阅读全文

posted @ 2013-04-06 15:22 俊介三在前进 阅读(276) 评论(0) 推荐(0)

摘要:尾递归(tail recursive)是指把结果保存在参数中,而不是每次都要重新计算子结果的值。相当于把中间过程保存了以提高计算效率#include <stdio.h>int fac(int n){ if(n==0 || n==1) return 1; else return fac(n-1)*n;}//tail recursive//满足两点:1递归调用在函数最后执行;2它的返回值不属于表达式的一部分。int fac2(int n, int a){ if(n==0 ||n==1) return a; else return fac2(n-1,n*a);}int mai... 阅读全文

posted @ 2013-03-24 16:08 俊介三在前进 阅读(128) 评论(0) 推荐(0)

摘要:插入排序、快速排序、归并排序、冒泡排序、选择排序、希尔排序。如下:#include <stdio.h>void swap(int& a, int& b){ int temp = a; a = b; b = temp;}void print(int* arr, int len){ int i; for(i=0;i<len;i++){ if(i==0) printf("%d",arr[i]); else printf(" %d",arr[i]); } puts("");}//insert sort. fi 阅读全文

posted @ 2013-03-24 15:25 俊介三在前进 阅读(161) 评论(0) 推荐(0)

摘要:二叉树的定义,及前、中、后、层、递归、非递归遍历。如下:#include <stdio.h>#include <stdlib.h>#include <stack>#include <queue>using namespace std;struct Node{ int data; Node* left; Node* right; Node(){} Node(int d){ data = d; left = NULL; right = NULL; }};//pre order travelvoid preorder(No... 阅读全文

posted @ 2013-03-23 23:30 俊介三在前进 阅读(156) 评论(0) 推荐(0)

摘要:有单循环和双循环链表两种。就是最后一个Node又指回头一个Node而形成一个环。它的一个例子是:LRU(最近最少使用)页面置换算法的其中一种实现-第二次机会置换法。当空闲页面链表为空时,系统将如何分配新的页帧?第二次机会置换法,它的工作方式是:维护一个当前存在于物理内存中的页面循环链表。假设链表中的每个元素只存储一个页码和一个引用值,引用值要么为1要么为0.在实践中,每个元素还会包含其他的信息。所有的页面初始的引用值都为0,每当系统访问页面时。该页面的应用值就设置为1.当需要某个页帧时操作系统就使用它维护的循环链表以及引用值来判断哪些页面应该释放其页帧。为了确定这一点开始遍历链表直到找到一个引 阅读全文

posted @ 2013-03-23 20:06 俊介三在前进 阅读(213) 评论(0) 推荐(0)

摘要:双链表相对于单链表来说,多了只想前一个Node的指针。假如有N个node的话,多了N个指针,换来了比单链更灵活的遍历(可以倒着来了),是不是需要这样,it all depends.双链表实验:one way or round trip? round trip!#include <stdio.h>#include <stdlib.h>struct DList{ int data; DList* prev; DList* next; DList(){} DList(int d){ data = d; prev = NULL; ... 阅读全文

posted @ 2013-03-23 19:43 俊介三在前进 阅读(143) 评论(0) 推荐(0)

摘要:单链表就是每个Node都有一个数据项和一个指向下一个Node的指针。优点显而易见:便于删除某个节点、添加某个节点;存储这个结构不需要连续的地址。其中一个例子是:页帧的管理。虚拟内存技术是一种地址空间的映射机制,它允许进程不必完全加载到物理内存也能运行。进程以为自己使用内存连续的地址,实际上内存为每个进程都配备了页表,它把进程以为的地址(连续的虚拟地址)和实际的物理地址(一般都是零零散散的吧)一一对应起来。但这样,当进程引用某个虚拟地址,根据这个页表查找,发现不在物理页帧上,就会产生页错误并为之在物理内存中分配一个页帧,至于什么进程页何时移除物理内存,又是另一个问题,有相应的机制。单链表的基本操 阅读全文

posted @ 2013-03-23 19:26 俊介三在前进 阅读(135) 评论(0) 推荐(0)

摘要:详见 http://www.cplusplus.com/reference/stl/vectorView Code #include <stdio.h>#include <vector>using namespace std;int main(){ vector<int>v; //把23加入到最后 v.push_back(23);//23 v.push_back(12);//23 12 //把最后的数删掉 v.pop_back();//23 //把最后的数删除 v.pop_back();// //清空 v.clear(); ... 阅读全文

posted @ 2013-03-08 19:07 俊介三在前进 阅读(159) 评论(0) 推荐(0)

摘要:已知前、中序遍历结果,求后序遍历结果。pre: abefcgin: ebfagc思路:前、中和后序遍历都是对于根节点来说的,前序就是说跟最先访问,然后再进行递归的前序遍历其左右子树自顶向下分析对于前序遍历,分为(a)(bef)(cg) 分别为根,前序遍历左子树的结果,前序遍历右子树的结果;对于中序遍历,分为(ebf)(a)(gc) 分别为中序遍历左子树的结果,根,中序遍历右子树的结果。可见,先找到两种遍历结果的根(即上面的a的位置,前序为首个元素,中序要找到它~),可以构造一个递归函数,对其进行访问,但每次都要确定访问的起始位置。如下:#include <iostream>#inc 阅读全文

posted @ 2013-03-05 21:48 俊介三在前进 阅读(162) 评论(0) 推荐(0)

摘要:队列的使用。详情见http://www.cplusplus.com/reference/queue/#include <stdio.h>#include <string.h>#include <queue>using namespace std;struct Node{ Node(){} Node(int a, char *n, int h){ age = a; strcpy(name,n); height = h; } int age; char name[20]; int height;}node[200];st... 阅读全文

posted @ 2013-03-05 14:37 俊介三在前进 阅读(253) 评论(0) 推荐(0)