摘要:最近做到一道题目,大概的意思就是求一个多叉树中两个节点的最近公共祖先,输入是用邻接矩阵表示的。要想理解tarjan算法并实现它,需要先理解一下内容:1) 深度优先搜索;tarjan算法核心思想:当某节点刚刚搜索完毕时,看与其相关的结点v是否已经被访问,如果v已经被访问过了,则它们的最近公共祖先就是v...
阅读全文
摘要:这里代码写的比较随意,直接使用数组下标作为索引,而结点就是用0到n-1来表示。类似于递归调用的思想(感觉就是把递归调用里面的调用栈用简单的栈数组来替代一下)。这里对于栈顶的元素,如果它为白色,则全局时间变量加一,且把它邻接链表里的白色节点全部入栈;而如果栈顶元素已经是灰色,就把它变成黑色,时间全局变...
阅读全文
摘要:这里利用直接寻址法去重,遍历链表,如果对应数组位置值为0,则修正为1,如果对应数组为1,则删除该节点。(数组初始化为0)链表的一些操作都简单的实现了一下。#include #include #include struct Node{ int key; Node *next;};struc...
阅读全文
摘要:散列表在实际应用中比较多,也是各种面试中出现频率比较高的内容(一般都是考你如何应用)。散列表是实现字典操作的一种有效数据结构,其最突出的是查找性能,在一些合理的假设下,散列表中查找的平均时间为O(1)。下面介绍几种常见的散列表。直接寻址表(适用于关键字的全域U比较小的情况)直接寻址表就是一个数组,其...
阅读全文
摘要:前面几种遍历方法比较简单,说明一下最后一种1. 如果路径上前一个节点是父节点,则往左孩子方向走2. 如果路径上前一个节点是左孩子,则往右孩子方向走3. 如果路径上前一个节点是右孩子,则往父节点方向走处理下孩子缺失的情况1. 如果只有一个右孩子且从父节点过来,往右孩子方向走 (有右无左)2. 如果从左...
阅读全文
摘要:对每个属性使用一个数组表示,多数组可以表示一组同构的对象。指针放在额外的数组中,用下标来表示。这次实现代码基于10.3-5, 主要为了实现compacitify 操作,即把链表的所有元素在存储器中保持紧凑,本题是都放到前n个位置(n个元素)。思想是从网上看来的,移动元素的过程中保持链表中元素的相互指...
阅读全文
摘要:数组实现双端队列的时候注意区别判断上溢和下溢。用两个栈实现队列,就相当于把两个栈底靠在一起(背靠背),一个栈用来出队列,一个栈用来进队列。这个队列的操作时间大部分时候是常数时间,除了出列的栈为空,需要把进列的栈全部转移过去,再出列。Back()操作和Pop()操作类似,也是这样。而两个队列实现栈,队...
阅读全文
摘要:顺序统计量有关算法得与快速排序的分割联系起来#include #include using namespace std;typedef int index;index Rand_Partition(int *a, index p, index r);index Partition(int *a, i...
阅读全文
摘要:It is amazing!列排序算法看起来很奇怪,但是它真的可以用来对所有数据排序,只不过需要有一些条件。列排序算法是用于包含n个元素的矩形数组的排序,这个数组r行s列,满足下面三个条件:1) r为偶数2) s为r的因子3) r大于等于2s2这里就不去证明这个算法的正确性,证明见算法导论思考题8-...
阅读全文
摘要:使用STL中priority_queue(由最大最小堆实现的)来实现。注意传递参数的时候需要传递三个。模板声明:priority_queue这里的实现要求输入完全正确,所以代码移植性非常差。#include #include #include using namespace std;typedef ...
阅读全文
摘要:水壶问题要求我们把红蓝水壶进行配对。如何才能让红蓝水壶一一对应,那就是分别对它们进行排序。所以这里借助快排的思想来进行排序,红水壶数组使用蓝水壶中的pivot来排序,蓝水壶使用红水壶中的pivot来排序。由于前提条件红水壶有一个对应的蓝水壶,反之亦然,且红水壶内部各不相同,所以排序就很简单,稍微修改...
阅读全文
摘要:第一步,先按数据的长度排序,计算出数据的长度(一般大小为正整数),然后按计数排序的方法排序第二步,对相同长度的数据进行基数排序。基数排序采用计数排序作为稳定排序。这里遇到了一个问题,第二问对字符串按字典序排列(a#include #include using namespace std;const ...
阅读全文
摘要:题目读起来有点晦涩,理解之后思路比较容易想到。其实就是排序的元素换成了闭区间,而闭区间‘相等’就是这些区间有公共的区域(等价类),这样就类似于习题7.2了,返回两个下标,它们之间是相等的元素,前面是‘较小’的区间,后面是‘较大’的区间。那么如何求公共子区间呢,我这里是从前往后遍历数组,如果有交叠,...
阅读全文
摘要:计算机中用位来表示整数,一种方式只能表示非负数,一种可以表示有符号数。无符号数编码: 补码编码: 由上面的定义可以知道补码与无符号之间的对应关系(见下式),最高位为0时,补码与无符号表示是一样的,而最高位为1时,举个例子,补码表示的-1对应于无符号数的4294967295(这里指的是32位数)。 在...
阅读全文
摘要:个人总结:1.int **p和 int a[M][N]之间的区别: 1) int **指向指针的指针;而后者的类型是数组名,类型为 int (*)[N],即指向的是整个一行。 2) (a+1) 表示地址增加M*sizeof(int),需要注意的一点是a[i]是第i行开头的地址,&a和a的值是一样的。...
阅读全文
摘要:快速排序通常是实际排序中应用最好的选择,因为平均性能很好,且是原址排序,不稳定。书上的大部分内容在分析其运行时间,感觉看一下就好了(还是蛮喜欢数学的,可是。。。)#include #include #include using namespace std;//实际应用比较多,原址排序typedef ...
阅读全文
摘要:D叉堆不同的地方就是父节点和孩子节点在数组中的索引,C++代码,希望不要误人子弟。#include #include #include using namespace std;template //D叉堆class Heap_t{public: Heap_t(vector &ptr, int...
阅读全文
摘要:自我感觉代码写的比较乱,这方面要好好注意一下。总结:1.在使用vector::size_type 类似的类型时,千万要注意循环的条件判断,很容易发生溢出的危险!所以我最后很懒的选择使用int - -。2.下标表示和元素个数表示之间的细微差别。下标之间的变换关系:父节点 parent(i)=(i-1)...
阅读全文
摘要:插入排序和归并排序是算法导论先讲到的两中排序方法。 插入排序的思路是对于一个已经排好序的数组,现在新插入一个元素并且保持其有序。那么该如何插入呢,从数组最后一个元素开始进行比较,直到遇到比小于等于自己的元素,然后插入到该元素的后面(所以插入是稳定的)。循环不变式:子数组一直保持有序(使用循环不变式...
阅读全文