1. 算法导论 学习笔记
文章平均质量分 65
梦幻DUO
游戏开发爱好者
展开
-
算法导论 KMP字符串匹配
KMP字符串匹配 1. KMP字符串匹配的原理 Knuth-Morris-Pratt算法(简称KMP),是一种非常高效的字符串匹配。设n为文本的长度,m为待查找文本模板的长度,则预处理时间需要O(m),匹配时间需要O(n)。 1.预处理阶段。KMP字符串匹配的原理就是为待查找的字符串模板创建一个前缀函数,该前缀函数得到对于模板每一个子字符串(1~i),若有相同的长度的前缀和相同的长度的后缀的字原创 2015-09-28 17:14:09 · 1052 阅读 · 0 评论 -
算法导论 O(n)时间内反转单链表
算法导论 O(n)时间内反转单链表1. 算法导论原题 Give a O(n) time nonrecursive procedure that reverses a singly linked list of n elements. The procedure should use no more than constant storage beyond that needed for thel原创 2015-09-18 16:45:32 · 1488 阅读 · 0 评论 -
算法导论 循环双链表
循环双链表1. 什么是循环双链表? 循环双链表:循环,即是首尾相连的链表。双链表,即是在原来单链表的基础上,使结点不单只能指向下一个结点,也能指向上一个结点。2. 循环双链表的基本操作(伪代码) LIST-SEARCH(L,k) x = L.headwhile x ≠NIL and x.key ≠ kx = x.nextreturn x LIST-INSERT(L原创 2015-09-18 10:21:26 · 618 阅读 · 0 评论 -
XOR Linked List – A Memory Efficient Doubly Linked List
An ordinary Doubly Linked List requires space for two address fields to store the addresses of previous and next nodes. A memory efficient version of Doubly Linked List can be created using only one sp转载 2015-09-19 11:10:57 · 831 阅读 · 0 评论 -
算法导论 单链表
单链表1. 单链表是什么? 单链表是一种常见的简单数据结构,链表由很多个结点组成,每个结点有储存数据的数据域和指向下一个结点的地址。因为每个结点都有下一个结点的地址,因此通过当前结点可以找到下一个结点,将各种数据就像链子一样连接起来。相比于数组,链表的优点就是大小可以改变,删除和插入数据也不必作太大的改动,缺点是不可以随机访问(必须通过一个结点访问下一个结点来访问你想访问的结点)。2. 单链表原创 2015-09-17 20:02:01 · 635 阅读 · 0 评论 -
算法导论 使用单链表实现队列
使用单链表实现队列1. 算法导论原题 10.2-3 Implement a queue by a singly linked list L. The operations ENQUEUE and DEQUEUE should still take O(1) time. 译:使用两个队列实现一个队列。入队和出队的时间复杂度都应该是O(1)。2. 使用单链表实现队列 我们假设链表是原创 2015-09-17 23:35:10 · 1228 阅读 · 0 评论 -
算法导论 合并两个链表
合并两个链表1. 算法导论原题 10.2-6 The dynamic-set operation UNION takes two disjoint sets S1 and S2 as input, and it returns a set S = S1 U S2 consisting of all the elements of S1 and S2.The setsS1 andS2 are原创 2015-09-18 11:33:12 · 536 阅读 · 0 评论 -
算法导论 循环单链表
循环单向链表1. 循环单向链表如何实现? 循环单向链表只是在单向链表的基础上使尾结点指向头结点。因为每次插入结点,新结点都是指向上一个结点当前的下一个结点。因此在单向链表的基础上,我们使头结点指向自身即可。 因此只需要在以前的博文单链表代码中的构造函数初始化的时候,加上一行代码,便做到了循环: m_pHeadNode->SetNext(m_pHeadNode);2. 实现(C++代原创 2015-09-18 09:26:15 · 507 阅读 · 0 评论 -
算法导论 使用两个栈实现队列
使用两个栈实现队列1. 如何使用两个栈实现队列? 因为栈的顺序是后进先出,队列是先进先出。通过把一个栈“倒”进第二个栈,可以在第二个栈以原来入栈的顺序出栈,就达到了队列的先进先出效果。 注意关于如何“倒”,也有效率的高低之分。 我使用的方法是(一个栈称StackIn,另一个栈称StackOut): 1.当入队列时,不用判断StackOut有没有元素,只要没达到队列的上限,就直接原创 2015-09-15 23:25:10 · 589 阅读 · 0 评论 -
算法导论 使用单链表实现栈
使用单链表实现栈1. 算法导论原题 10.2-2 Implement a stack using a singly linked list L. The operations PUSH and POP should still take O(1) time. 译:使用一个单链表实现一个栈。PUSH和POP操作仍然需要保持O(1)时间复杂度。2. 如何使用单链表实现栈? 栈的主要原创 2015-09-17 21:52:23 · 728 阅读 · 0 评论 -
算法导论 使用两个队列实现一个栈
用两个队列实现一个栈1. 算法导论原题 10.1-7 Show how to implement a stack using two queues. Analyze the running time of the stack operations. 译:使用两个队列实现一个栈。分析栈操作的运行时间(这部分本博文不解答)。2. 如何使用两个队列实现一个栈? 由于队列的方式是后进后原创 2015-09-17 19:13:29 · 763 阅读 · 0 评论 -
算法导论 顺序双向栈——两个栈共享同一存储空间
双向栈——两个栈共享同一存储空间1. 什么是双向栈? 算法导论原题: 10.1-2 Explain how to implement two stacks in one array A[1..n] in such a way that neither stack overflows unless the total number of elements in both stacks原创 2015-09-15 17:57:27 · 4379 阅读 · 0 评论 -
算法导论 简单顺序栈
简单栈1.什么是栈? 栈是一种基本的数据结构,栈这种数据结构实现的是一种对元素进行后进先出(last-in, first-out,LIFO)的策略。2.栈的基本操作(伪代码) STACK-EMPTY(S) if S.top == 0 return TRUEelse return FALSE PUSH(S, x) //这里未考虑上溢 S.top =原创 2015-09-10 21:00:38 · 720 阅读 · 0 评论 -
算法导论 顺序循环队列
简单顺序队列1.什么是队列?什么是顺序队列? 队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾,每次离开的成员总是队列头上的。队列的顺序存储结构称为顺序队列,顺序结构可以用数组来实现。2.顺序队列的基本操作(伪代码) 队列具有两个指向,一个是头指向(head),一个是尾指向(tail)。初始化原创 2015-09-13 16:03:25 · 850 阅读 · 0 评论 -
算法导论 顺序循环双向队列
顺序双向队列1. 什么是顺序双向队列? 算法导论原题: 10.1-5 Whereas a stack allows insertion and deletion of elements at only one end, and a queue allows insertion at one end and deletion at the other end, a deque (dou原创 2015-09-15 20:19:59 · 1498 阅读 · 0 评论 -
算法导论 XOR双向循环链表——内存高效链表
XOR双向循环链表——内存高效双向链表1. 算法导论原题 10.2-8 ? Explain how to implement doubly linked lists using only one pointer value x.np per item instead of the usual two(next and pre). Assume that all pointer values原创 2015-09-20 00:42:54 · 1903 阅读 · 4 评论