随笔分类 - 算法导论
摘要:问题:d叉堆性质与二叉堆相似,但其每个非叶子结点有d个孩子;1) 如何在一个数组中表示一个d叉堆?2) 包含n个元素的d叉堆的高度是多少?3) 给出 EXTRACT-MAX在d叉堆的有效实现,并用d与n表示其时间复杂度.4) 给出INSERT在d叉堆的有效实现,并用d与n表示其时间复杂度.5) 给出...
阅读全文
摘要:问题:设计一个时间复杂度为O(NlogK)的算法,它能够将K个有序链表合并为一个有序链表,这里的N为所有输入链表包含的总的元素个数分析:该问题为经典的利用堆完成K路归并的问题:当K个序列满足一定的条件(如单调不减或单调不增)时,利用堆实现K路归并使其归并为一个满足相同条件的序列,具体做法如下:1)假...
阅读全文
摘要:6.5-3 1 HEAP-MINIMUM(A) 2 return A[1] 3 4 HEAP-EXTRACT-MIN(A) 5 if A.heap-size A[i]15 error "new key is biger than current key"16 A[...
阅读全文
摘要:10.4-2 给定n个结点的二叉树,写出一个O(n)时间的递归程序,将该树种每个结点的关键字输出。伪代码:1 TREE-PRINT(T)2 if T != NIL3 print key[T]4 TREE-PRINT( left[T] )5 TREE-PRINT( right[...
阅读全文
摘要:题目:对于一棵有N个结点的树,设计在O(N)时间内完成的先序、中序与后序遍历算法一、先序遍历递归实现:void InOrder( SearchTree T ){ if ( T != NULL ) { Visit( T ); InOrder( T->Left )...
阅读全文
摘要:题目:设计一个执行中序遍历的非递归算法解答:分析:1、使用栈模拟递归调用的过程,即可以实现中序遍历2、在结点中增加指针域,使该指针域指向父节点,通过迭代即可实现中序遍历非递归算法:栈模拟算法版本一:// InOrder Traveraslvoid InOrder( SearchTree T ) { ...
阅读全文
摘要:题目:给出O(N)运行时间的非递归算法,实现对一个含N个元素的链表的逆转,要求空间复杂度为O(1)代码:/* Assuming List with header and L is not empty */List ReverseList( List L ){ Position CurrentP...
阅读全文
摘要:题目:用两个队列实现一个栈,并分析栈操作运行时间分析:栈的操作只能在表头进行;而队列的入队在表头进行,出队只能在栈尾进行;考虑将栈底元素变为栈顶元素,即进行倒置,就能在表头进行Pop操作;解答:(不考虑溢出)1、使用两个队列A与Tmp,Tmp队列作为中转;2、当进行Push操作时,在队列A中进行入队...
阅读全文
摘要:题目:用两个栈实现一个队列,并分析相关队列操作的运行时间解答:1、使用两个栈S1与S2;2、通过栈S1的Push执行队列入队操作,通过栈S2的Pop执行队列出队操作3、当栈S2为空后,即S1->Top = S2->Top,转换;栈S2的Push执行入队操作,栈S1的Pop执行出队操作操作时间复杂度:...
阅读全文
摘要:问题:给定n个整数的集合S和另一个整数X,描述一个运行时间为O(log N)的算法,该算法能够确定S中是否存在两个其和刚好为X的元素算法描述:1、先将集合中元素排序在数组A中2、对于集合中的每一个元素A[i],在排好序的数组A中二分查找 X-A[i]3、查找成功则存在,循环结束后查找未成功则不存在伪...
阅读全文
摘要:1、二分查找(Binary Search) 二分查找又称折半查找,它是一种效率较高的查找方法。 二分查找要求:线性表是有序表,即表中结点按关键字有序,并且表的存储结构为顺序结构。不妨设有序表是递增有序的。2、二分查找的基本思想 二分查找算法思想: (1)首先确定该区间的中点位置: mid...
阅读全文
摘要:一、题目 用一个数组A[ 1....N ]实现两个栈,除非数组的每一个单元都被使用,否则栈例程不能有溢出,注意PUSH和POP操作的时间应为O(1)。二、解法 对于一个数组,由它的两端作为栈底,栈向数组中间扩展。当数组中每个元素被用到时,栈满。三、代码struct Node;typedef No...
阅读全文

浙公网安备 33010602011771号