随笔分类 -  数据结构&算法

Longest Increasing Subsequences(最长递增子序列)的两种DP实现
摘要:一、本文内容最长递增子序列的两种动态规划算法实现,O(n^2)及O(nlogn).二、问题描述最长递增子序列:给定一个序列,从该序列找出最长的 升序/递增 子序列。特点:1、子序列不要求连续; 2、子序列在原序列中按严格(strictly)升序排序; 3、最长递增子序列不唯一。注:下文最长递增子序列用缩写LIS表示。example:0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15对应的LIS:0, 2, 6, 9, 13, 150, 4, 6, 9, 11, 15三、算法描述1、考察第i+1个元素时,不考虑前面i个元素的状态给定长度为n的 阅读全文
posted @ 2013-10-26 15:15 Seiyagoo 阅读(1829) 评论(2) 推荐(1) 编辑
LLRB——红黑树的现代实现
摘要:一、本文内容以一种简明易懂的方式介绍红黑树背后的逻辑实现2-3-4树,以及红黑树的插入、删除操作,重点在2-3-4树与红黑树的对应关系上,并理清红黑树相关操作的来龙去脉。抛弃以往复杂的实现,而分析红黑树的一种简单实现LLRB。二、算法应用红黑树,给人以强烈的第一听觉冲击力——红与黑,好像很高端的感觉。事实上的确如此,红黑树是一种高级数据结构,在C++、Java的标准库里作为set、map的底层数据结构实现,以及linux中进程的公平调度。三、2-3-4树标题是红黑树,为什么讲2-3-4树?因为红黑树就是2-3-4树的一种等价形式,更准确地来说,我们用红黑树来完成2-3-4树的各种操作(如插入、 阅读全文
posted @ 2013-10-13 01:45 Seiyagoo 阅读(8570) 评论(8) 推荐(1) 编辑
generating permunation——全排列(算法汇总)
摘要:本文一共提供了4种全排列的方法,包括递归非字典序版本、递归字典序版本、标准库版本和BFS字典序版本,当然BFS非字典序实现相对于BFS字典序版本更加简洁,稍加修改即可。说明:递归版本基于网上现有代码修改而成,标准库版本参照msdn sample修改而成,最后的BFS版本是由本人在看到题目后思考而来,并实现之(递归版本很久之前写过),所有四种算法都加了模板。当然BFS版本效率相对于递归要快,相对于STL版本则较慢,仅仅提供一种思路而已。注:对于这种小算法,自己主动思考可以开阔思路,而且想出一种新思路感觉会很不错;对于已成型的经典或者复杂算法,新思路的空间会非常小,所以可以以掌握为主。/**@de 阅读全文
posted @ 2013-09-30 00:39 Seiyagoo 阅读(1292) 评论(1) 推荐(0) 编辑
Voronoi Diagram——维诺图
摘要:Voronoi图定义任意两点p 和q 之间的欧氏距离,记作 dist(p, q) 。就平面情况而言,我们有dist(p, q) = (px-qx)2+ (py-qy)2设P := {p1, …, pn}为平面上任意 n 个互异的点;这些点也就是基点。按照我们的定义,所谓P对应的Voronoi图,就是平面的一个子区域划分——整个平面因此被划分为n 个单元(cell ),它们具有这样的性质: 任一点q位于点pi 所对应的单元中,当且仅当对于任何的pj∈Pj, j≠i,都有dist(q, pi)三元组。发生circle event时,并不知道这是一个false alarm,所以直到碰到该外接圆内部存 阅读全文
posted @ 2013-09-25 23:01 Seiyagoo 阅读(24252) 评论(7) 推荐(3) 编辑
二叉树三种非递归遍历的区别
摘要:1 #include <iostream> 2 3 #define MAXN 100 4 using namespace std; 5 6 7 struct BTNode 8 { 9 char tag; 10 BTNode *left; 11 BTNode *right; 12 }; 13 14 class BTree 15 { 16 private: 17 BTNode **root; 18 void BuildBTree(BTNode **root); 19 20 public: 21 /*递归版本*/ 22 ... 阅读全文
posted @ 2012-07-05 15:21 Seiyagoo 阅读(1548) 评论(5) 推荐(1) 编辑
模拟LRU算法&通道处理算法
摘要:最近写了两个程序,模拟操作系统的算法,只是基本实现了课本上的基本功能,实际应该是很复杂的。模拟LRU页面置换算法: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define TN 3 //分配给该程序的主存页数 6 #define PN 10 //地址流 7 8 typedef struct PAGE{ 9 int kPage; //the kth line 分配给该程序的主存页数的索引 10 int aPag... 阅读全文
posted @ 2012-04-07 23:25 Seiyagoo 阅读(1311) 评论(0) 推荐(0) 编辑
单链表带头结点&不带头结点
摘要:Node *head; //声明头结点带头结点初始化void InitList(Node **head){ *head=(Node *)malloc( sizeof(Node)); (*head)->next=NULL;}带头结点尾插入,统一操作方式一:void CreatList(Node **head){ Node *r=*head,*s; int a; while(scanf("%d",&a)){ if(a!=0){ s=(Node *)malloc(sizeof(Node)); s->value=a; r->next=s; r=s; } e 阅读全文
posted @ 2012-03-30 22:06 Seiyagoo 阅读(4119) 评论(0) 推荐(1) 编辑
扩展的欧几里得&中国剩余定理
摘要:扩展的欧几里得(EXTENDED-EUCLID)一、假设: 对于给定的整数a和b,它们满足方程:ax+by=d=gcd(a,b),求出整系数x,y二、推理: ax+by=gcd(a,b)=gcd(b,a%b)=bx+(a-(int)a/b*b)y=ay+b(x-(a-(int)a/b*y)三、扩展的欧几里得算法: 1 int extended_gcd(int a, int b, int &x, int &y) 2 { 3 int ret, tmp; 4 if (!b) { 5 x = 1; y = 0; return a; 6 ... 阅读全文
posted @ 2012-03-21 19:05 Seiyagoo 阅读(2421) 评论(3) 推荐(3) 编辑
深入理解栈
摘要:栈:保存了一个函数调用所需要维护的信息,常被称为堆栈帧或活动记录.ebp:帧指针,固定不变,可以用来定位函数活动记录中的各个数据。ebp直接指向的是调用函数前ebp(即下图的old ebp)的值;在函数返回时,ebp可以通过读取这个值恢复到调用前的值。intel下函数调用:参数压栈(从右向左)当前指令的下一条指令地址压栈跳转到函数体执行其中第2,3步由指令call一起执行,编译器可能要求某些寄存器在调用前后保持不变,或者生成的临时变量都需要压栈。多级调用栈布局PS:Debug模式下未初始化的局部变量出现"烫"或者"屯"原因->栈空间给变量分配空间的 阅读全文
posted @ 2011-12-10 22:52 Seiyagoo 阅读(359) 评论(1) 推荐(0) 编辑