![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法导论
无力吐槽的典哥
不错
展开
-
算法导论第十一(11)章散列(Hash)表知识点梳理及详细课后答案
11.1直接寻址表关键字集合U = { 0, 1, ..., m - 1 },实际的关键字集合K。用一个数组T[0..m - 1],其中每个位置对应U中的一个关键字k。把关键字k映射到槽T(k)上的过程称为散列。散表表仅支持INSERT、SEARCH、DELETE操作。11.1-1假设一动态集合S用一个长度为m的直接寻址表T表示。请给出一个查找S中最原创 2017-10-27 10:19:08 · 5329 阅读 · 0 评论 -
为什么Dijkstra算法不能处理带负权边的图
Dijkstra算法在运行过程中维持的关键信息是一组节点集合S,从源节点s到该集合中每个节点之间的最短路径已经被找到。算法重复从节点集合V-S中选择最短路径估计最小的节点u,将u加入到集合S,然后对所有从u出发的边进行松弛操作。当把一个节点选入集合S时,即意味着已经找到了从源点到这个点的最短路径,但若存在负权边,就与这个前提矛盾,可能会出现得出的距离加上负权后比已经得到S中的最短路径还短。(无法回...原创 2018-02-22 11:10:48 · 11916 阅读 · 3 评论 -
排序算法详解【归并排序-Merge_Sort】
核心思想:分治。主题流程:先将一个序列分成很多个不能再分割的子序列,将各个子序列分别排序后再将子序列合并。其实就是重复两个步骤:【1】分【2】合并。首先是第一个小问题,怎么分?比如说一个序列:12 ,23,1,44,233,10,9,8。我们先分成两段:12 ,23,1,44 和 233,10,9,8,发现还能再分成4段:12 ,23 和 1,44------233原创 2017-12-16 16:08:07 · 322 阅读 · 0 评论 -
算法导论第三版第七章课后答案
7.1-1 参照图7-1的方法,说明PARTITION在数组A={13,9,9,5,12,8,7,4,21,2,6,11}上的操作过程。A={13,19,9,5,12,8,7,4,21,2,6,11} ={13,19,9,5,12,8,7,4,21,2,6,11} ={13,19,9,5,12,8,7,4,21,2,6,11} ={9,19,13,5,12原创 2017-12-07 10:22:20 · 3368 阅读 · 0 评论 -
算法导论第三版第七章快速排序(一般和随机化版本)
快速排序是利用交换操作的排序,所以不是稳定排序法,最快及平均时间复杂度为O(nlogn),最坏为O(n*n)。步骤:(1)分解:数组A[p...r]被划分为两个子数组A[p...q-1]和A[q+1...r],使得A[p...q-1]中的每一个元素都小于等于A[q],而A[q]也小于等于A[q+1...r]中的每个元素。(2)解决:通过递归调用快速排序,对于子数组A[p...q-1]和原创 2017-12-07 10:07:47 · 589 阅读 · 0 评论 -
算法导论第三版第六章 合并K个有序链表的三种解法(最小堆法和分治递归法)
题目要求是将k个有序链表合并为一个链表,时间复杂度限定为O(nlogk)。下面给出应用最小堆方法的两个程序,最后再贴上利用分治递归法的代码,虽然时间复杂度不及堆方法,但思路相对简单好理解。(1)最小堆方法1用一个大小为K的最小堆(用优先队列+自定义降序实现)(优先队列就是大顶堆,队头元素最大,自定义为降序后,就变成小顶堆,队头元素最小),先把K个链表的头结点放入堆中,每次取堆顶元素,然后将原创 2017-12-05 16:40:21 · 3082 阅读 · 0 评论 -
二叉树的递归遍历(思路简单清晰)
预先建立用数组表示的二叉树的内容,然后建立二叉树,并进行前序、中序、后序遍历的操作,代码如下:#include#includeusing namespace std;class tree {public: int data; class tree *left, *right;};typedef class tree* btree;btree create_tree(btre原创 2017-12-14 11:31:19 · 1995 阅读 · 0 评论 -
算法导论第三版-第6章堆排序操作完整代码(建堆、插入、删除、排序等)
程序如下:// heap_sort.cpp : 定义控制台应用程序的入口点。//#include#includeusing namespace std;#define N 1000#define PARENT(i) (i)>>1#define LEFT(i) (i)<<1;#define RIGHT(i) ((i)<<1)+1class Heap{public: /原创 2017-12-04 16:50:50 · 506 阅读 · 0 评论 -
算法导论第三版第四章 最大子数组和的三种解法(暴力、教材分治法、线性解法)
1.暴力求解法该方法的思想非常简单,先找出从第1个元素开始的最大子数组,而后再从第2个元素开始找出从第2个元素开始的最大子数组,依次类推,比较得出最大的子数组。实现代码如下:/* 常规方法,时间复杂度O(n*n) 先从第一个元素开始向后累加, 每次累加后与之前的和比较,保留最大值, 再从第二个元素开始向后累加,以此类推。 */ int MaxSubSum1(int *ar原创 2017-12-02 11:24:05 · 1045 阅读 · 0 评论 -
算法导论第三版-思考题2-1
在合并排序中对小数组采用插入排序,代码如下:#include#includeusing namespace std;int* Insert_sort(int A[],int B[],int p,int q,int r);void Merge(int A[],int p,int q,int r);void Merge_sort(int A[],int p,int r,int k);v原创 2017-12-01 11:17:13 · 1781 阅读 · 1 评论 -
算法导论第三版第十章 单链表实现栈和队列(思路简单清晰)
1.单链表实现栈虽然以数组结构来实现栈的好处是算法设计简单,但如果栈的大小可改变的话,由于数组的大小需事先声明,这时必须使用最大可能性的数组空间来考虑,这样会造成内存空间的浪费。而利用链表来实现栈的优点是随时可以动态改变链表长度。代码如下:#include#include#includeusing namespace std;class listnode {public: in原创 2017-12-09 10:35:29 · 445 阅读 · 0 评论 -
算法导论16.2-2--动态规划(0-1背包问题)
转载出处:http://blog.csdn.net/luoshixian099/article/details/46572285背包问题小偷发现了n个商品,第i个商品重量为wi,价值为vi。小偷希望尽量拿走价值高的商品,但是他的背包只能容纳W重的商品。求如何取舍这些商品? 由于对一个商品,要么被拿走要么不被拿走,所以被称为0-1背包问题。 我们如果采取枚举法进行比较,将会有转载 2017-11-03 10:38:35 · 570 阅读 · 0 评论 -
排序算法总结
1.冒泡排序法void bubble_sort(int data[]){ for(int i=n-1;i>=0;--i) { int flag=0; for(int j=0;j<i;++j) { if(data[j+1]<data[j]) { int tmp; tmp=data[j]; data[j]=data[j+1]; ...原创 2018-03-01 11:10:46 · 166 阅读 · 0 评论