
数据结构心法指南
文章平均质量分 86
简单介绍了数据结构中常用的结构与常用算法。
-出发-
学生一个,正处于学习阶段,希望与大家多多交流
展开
-
小白专场: 电话聊天狂人
给定大量手机用户通话记录,找出其中通话次数最多的人,即为电话聊天狂人。输入格式:输入首先给出正整数N(N≤105),为通话记录条数。随后输入N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。输出格式:在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并...原创 2018-12-11 20:33:14 · 972 阅读 · 0 评论 -
散列表的性能分析
1 前言 平均查找长度(ASL)用来度量散列表查找效率:成功、不成功 关键词的比较次数,取决于产生冲突的多少影响产生冲突多少有以下三个因素:(1)散列函数是否均匀;(2)处理冲突的方法;(3)散列表的装填因子α。分析:不同冲突处理方法、装填因子对效率的影响2 线性探测法的查找性能可以证明,线性探测法的期望探测次数 满足下列公式:当α= 0.5时,插入操作和不成功查找的期...原创 2018-12-09 16:36:20 · 3004 阅读 · 0 评论 -
冲突处理方法----分离链接法
1 前言常用处理冲突的思路:换个位置: 开放地址法同一位置的冲突对象组织在一起:链地址法2 分离链接法分离链接法:将相应位置上冲突的所有关键词存储在同一个单链表中举例说明最直接:设关键字序列为 { 47, 7, 29, 11, 16, 92, 22, 8, 3, 50, 37, 89, 94, 21 };散列函数取为:h(key) = key mod 11;用分离链接法处理冲突...原创 2018-12-09 11:08:16 · 3163 阅读 · 0 评论 -
冲突处理方法----开放定址法
常用处理冲突的思路:换个位置: 开放地址法同一位置的冲突对象组织在一起:链地址法1 开放定址法(Open Addressing)一旦产生了冲突(该地址已有其它元素),就按某种规则去寻找另一空地址若发生了第 i 次冲突,试探的下一个地址将增加di,基本公式是:hi(key) = (h(key)+di) mod TableSize ( 1≤ i < TableSize )di...原创 2018-12-09 10:58:09 · 17185 阅读 · 2 评论 -
散列函数的构造方法
一个“好”的散列函数一般应考虑下列两个因素:计算简单,以便提高转换速度;关键词对应的地址空间分布均匀,以尽量减少冲突。数字关键词的散列函数构造1 直接定址法取关键词的某个线性函数值为散列地址,即h(key) = a × key + b (a、b为常数)地址 h(key)出生年月(key)人数(attribute)019001285万119011...原创 2018-12-09 09:59:28 · 6810 阅读 · 5 评论 -
散列表
前言在讲散查找之前,我们先说一下为什么要使用散列查找现在已知的几种查找方法:查找方法复杂度顺序查找O(N)二分查找(静态查找)O(log2N)插值查找斐波那契查找O(log2N)二叉搜索树O(h) h为树的高度平衡二叉树O(log2N)用二叉搜索树查找前面在介绍 二叉排序树(BST)的创建,查找,插入,删除及最大最小结点的时...原创 2018-12-09 09:54:46 · 456 阅读 · 0 评论 -
数据结构心法概要
章节题目串模式匹配算法树二叉树的层序遍历树二叉排序树(BST)的创建,查找,插入,删除及最大最小结点树非递归实现二叉树遍历(附c++完整代码)树遍历二叉树的应用:输出二叉树中的叶子结点、求二叉树的高度树树的同构树平衡二叉树(AVL树)树小白专场—是否同一棵二叉搜索树树哈夫曼树与哈夫曼编码堆堆,堆的创建,插...原创 2018-11-03 00:31:08 · 2910 阅读 · 4 评论 -
排序算法时间复杂度,额外空间复杂度比较
排序方法平均时间复杂度最坏情况下时间复杂度额外空间复杂度稳定性简单选择排序O(N2)O(N2)O(1)不稳定冒泡排序O(N2)O(N2)O(1)稳定直接插入排序O(N2)O(N2)O(1)稳定希尔排序O(Nd)O(N2)O(1)不稳定堆排序O(NlogN)O(NlogN)O(1)不稳定快速排序O(Nl...原创 2018-11-29 16:02:33 · 2054 阅读 · 0 评论 -
基数排序
桶排序在介绍基数排序之前,我们先看看桶排序的原理。假设我们有N个学生,他们的成绩是0到100之间的整数(于是有M = 101个不同的成绩值)。如何在线性时间内将学生按成绩排序?在这个例子中我们看到数据的特殊性,学生可以有很多,但是种类就只有101种,我们建立101个桶,每个桶一个成绩值,桶中的存放的是链表,相同成绩的学生在对应的桶中构成链表,扫描每个学生的成绩,依次将其插入到对应的桶中。...原创 2018-11-29 11:02:37 · 745 阅读 · 0 评论 -
表排序
1、算法概述 间接排序定义一个指针数组作为“表”(table)如果仅要求按顺序输出,则输出:A[table[0]],A[table[1]],……,A[table[N-1]]原创 2018-11-21 16:19:34 · 2161 阅读 · 6 评论 -
快速排序
1、算法概述分而治之选取一个主元,将元素分成小于主元的子集和大于主元的子集,在子集中继续选主元,划分什么是快速排序算法的最好情况?每次正好中分:T(N) = O(N logN)void Quicksort(ElementType A[], int N){ if (N < 2) return; pivot = 从A[]中选一个主元; 将S = { A[] \ pivot }...原创 2018-11-20 22:44:19 · 407 阅读 · 0 评论 -
归并排序
1、核心:有序子列的归并两个子列一共有N个元素,则归并的时间复杂度:T(N)=O(N)/* L = 左边起始位置, R = 右边起始位置, RightEnd = 右边终点位置*/void Merge(ElementType A[], ElementType TmpA[],int L, int R, int RightEnd){ int LeftEnd = R - 1; //左边终点...原创 2018-11-20 14:57:46 · 409 阅读 · 0 评论 -
堆排序
1、前言:选择排序void Selection_Sort(ElementType A[], int N){ for (i = 0; i < N; i++) { MinPosition = ScanForMin(A, i, N–1); //从A[i]到A[N–1]中找最小元,并将其位置赋给MinPosition Swap(A[i], A[MinPosition]); /...原创 2018-11-19 16:36:37 · 422 阅读 · 0 评论 -
希尔排序(by Donald Shell)
1、举例说明 定义增量序列DM > DM-1 > … > D1 = 1 对每个Dk进行“Dk间隔”排序( k = M, M-1, … 1 )注意:“Dk间隔”有序的序列,在执行“Dk-1间隔”排序后,仍然是“Dk间隔”有序的2、原始希尔排序DM = [N/2] , Dk = [Dk+1/2]#include<iostream>using n原创 2018-11-18 20:58:36 · 487 阅读 · 0 评论 -
简单排序——冒泡排序,插入排序,逆序对
前提void X_Sort ( ElementType A[], int N )//A是一个数组,N是数组的个数。 大多数情况下,为简单起见,讨论从小大的整数排序 N是正整数 只讨论基于比较的排序(> = < 有定义) 只讨论内部排序 稳定性:任意两个相等的数据,排序前后的相对位置不发生改变 没有一种排序是任何情况下都表现最好的...原创 2018-11-17 20:31:21 · 819 阅读 · 0 评论 -
【图(下)】拓扑排序
1、举例说明:计算机专业排课说明:学C1,C2是不需要提前学别的课程的,学C3则需要提前学C1,C2。把课程列表转换为图,其中顶点代表课程,则从V到W有一条边代表:V是W的预修课程2、拓扑排序 拓扑序:如果图中从V到W有一条有向路径,则V一定排在W之前。满足此条件的顶点序列称为一个拓扑序 获得一个拓扑序的过程就是拓扑排序 AOV如果有合理的拓扑序,则必定是有向无环图(Directe...原创 2018-11-14 00:20:31 · 866 阅读 · 0 评论 -
【图(下)】最小生成树问题
1、什么是最小生成树(Minimum Spanning Tree) 是一棵树无回路|V|个顶点一定有|V|-1条边 是生成树包含全部顶点|V|-1条边都在图里 边的权重和最小最小生成树存在↔ 图连通2、贪心算法 什么是“贪”:每一步都要最好的 什么是“好”:权重最小的边 需要约束:只能用图里有的边只能正好用掉|V|-1条边不能有回路3、P...原创 2018-11-12 20:10:17 · 3691 阅读 · 0 评论 -
【图(中)】小白专场: 哈利·波特的考试
题目:这门课是用魔咒将一种动物变成另一种动物。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe,把猫变成鱼,魔咒lalala。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。只允许带一只动物,考察把这只动物变成任意一只指定动物的本事。于是他来问你:带什么动物去可以让最难变的那种动物(即该动物变为自己带去的动物所需要的魔咒最长)需要的魔咒最短?例如...原创 2018-11-10 20:59:45 · 432 阅读 · 0 评论 -
【图(中)】最短路径问题
1、最短路径问题的抽象 在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径这条路径就是两点之间的最短路径(Shortest Path)第一个顶点为源点(Source)最后一个顶点为终点(Destination)2、问题分类 单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径(有向)无权图(有向)有权图 多源最短路径问题:求任意两...原创 2018-11-06 21:41:05 · 1743 阅读 · 1 评论 -
【图(上)】小白专场:如何建立图
1、用邻接矩阵表示图typedef struct GNode *PtrToGNode;struct GNode{ int Nv; //顶点数 int Ne; //边数 DataType Data[MaxVertexNum]; //存顶点的数据};typedef PtrToGNode MGraph; //以邻接矩阵存储的图类型MGraph初始化 初始化一个有Ver...原创 2018-11-03 00:09:03 · 1107 阅读 · 0 评论 -
【图(上)】六度空间
六度空间(Six Degrees of Separation) 你和任何一个陌生人之间所间隔的人不会超过六个题目:给定社交网络图,请对每个节点计算符合“六度空间”理论的结点占结点总数的百分比算法思路: 对每个节点,进行广度优先搜索 搜索过程中累计访问的节点数 需要记录“层”数,仅计算6层以内的节点数具体过程:对每一个结点求其6层以内可以访问的结点的总数,除以总数n就是该节...原创 2018-11-02 00:11:20 · 1616 阅读 · 0 评论 -
【图(上)】拯救007
题目说明:在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接踩着池子里一系列鳄鱼的大脑袋跳上岸去!设鳄鱼池是长宽为100米的方形,中心坐标为 (0, 0),且东北角坐标为 (50, 50)。池心岛是以 (0, 0) 为圆心、直径15米的圆。给定池中分布的鳄鱼的坐标、以及007一次能跳跃的...原创 2018-11-01 10:52:06 · 2551 阅读 · 0 评论 -
【图(上)】图的遍历,深度优先,广度优先
深度优先搜索(Depth First Search, DFS)类似于树的先序遍历先将根节点设置成已经访问过,对根节点的每一个邻接点,选取一个,查看有没有访问过,没有访问,设置成访问,并将此节点作为根结点,重复上述步骤;如果所有邻接点都已经访问过,放回到上一步的根节点中,查看是否有没有访问的邻接点,直到返回到第一步的根节点中。void DFS(Vertex V){ visited[V] ...原创 2018-10-26 09:59:52 · 467 阅读 · 0 评论 -
【图(上)】什么是图,抽象数据类型,怎么表示一个图
什么是图 表示“多对多”的关系 包含一组顶点:通常用V (Vertex) 表示顶点集合一组边:通常用E (Edge) 表示边的集合边是顶点对:(v,w)∈E(v, w) \in\mathbb E(v,w)∈E,其中v,w∈Vv, w \in\mathbb Vv,w∈V有向边< v, w> 表示从v指向w的边(单行线)不考虑重边和自回路抽象数据类型定义...原创 2018-10-25 11:44:07 · 1086 阅读 · 0 评论 -
小白专场: File Transfer--集合的简化表示,按秩归并与路径压缩
集合的简化表示typedef struct {ElementType Data;int Parent;} SetType;int Find(SetType S[], Elemtype X){ //在数组S中查找值为X的元素所属的集合 //MaxSize是全局变量,为数组S的最大长度 int i; for (i = 0; i < MaxSize && S[i...原创 2018-10-24 20:15:34 · 617 阅读 · 0 评论 -
小白专场:堆中的路径
题意理解将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。#include<iostream>using namespace std;#define MAXN 1001#define MINH -10001int H[MAXN], size;void Create(){ size = 0; H[0] = MI...原创 2018-10-24 11:40:52 · 360 阅读 · 0 评论 -
集合及运算
集合的表示集合运算:交、并、补、差,判定一个元素是否属于某一集合并查集:集合并、查某元素属于什么集合可以用树结构表示集合,树的每个结点代表一个集合元素集合运算(1)查找某个元素所在的集合(用根结点表示)int Find(SetType S[], Elemtype X){ //在数组S中查找值为X的元素所属的集合 //MaxSize是全局变量,为数组S的最大长度 int i...原创 2018-10-24 10:37:32 · 749 阅读 · 0 评论 -
哈夫曼树与哈夫曼编码
哈夫曼树的定义带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值 wk,从根结点到每个叶子结点的长度为 lk,则每个叶子结点的带权路径长度之和就是:n∈Nn\in\mathbb Nn∈N最优二叉树或哈夫曼树: WPL最小的二叉树哈夫曼树的构造:每次把权值最小的两棵二叉树合并在这里插入代码片...原创 2018-10-23 19:59:33 · 549 阅读 · 0 评论 -
堆,堆的创建,插入,删除,建立
什么是堆优先队列( (Priority Queue ):特殊的“ 队列” ,取出元素的顺序是依照元素的 优先权(关键字)。 大小,而不是元素进入队列的先后顺序。优先队列的完全二叉树示堆的两个特性结构性 :用数组表示的完全二叉树;有序性 : 任一结点的关键字是其子树所有结点的最大值(或最小值)“最大堆(MaxHeap) ”, 也称“ 大顶堆 ”:最大值“最小堆( MinHeap) ...原创 2018-10-23 11:18:49 · 12053 阅读 · 2 评论 -
小白专场—是否同一棵二叉搜索树
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。输入格式:输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的...原创 2018-10-21 17:48:27 · 1060 阅读 · 0 评论 -
平衡二叉树(AVL树)
1、什么是平衡二叉树平衡因子(Balance Factor,简称BF): BF(T) =hL-hR,其中hL和hR分别为T的左、右子树的高度。平衡二叉树(Balanced Binary Tree)(AVL树):空树,或者任一结点左、右子树高度差的绝对值不超过1,即|BF(T) |≤ 1最小不平衡子树:距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树设 nh 高度为h的...原创 2018-10-21 00:55:39 · 530 阅读 · 0 评论 -
树的同构
题目描述:给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结...原创 2018-10-18 16:04:19 · 352 阅读 · 0 评论 -
遍历二叉树的应用:输出二叉树中的叶子结点、求二叉树的高度
#include&lt;iostream&gt;using namespace std;#define len 10typedef struct BiNode{ int data; struct BiNode *left, *right;}BiNode,*BiTree;void searchTree(BiTree &amp;tree, BiTree &amp;tmp){ i...原创 2018-10-18 09:44:09 · 2789 阅读 · 0 评论 -
非递归实现二叉树遍历(附c++完整代码)
先序、中序和后序遍历过程:遍历过程中经过结点的路线一样,只是访问各结点的时机不同。从图中可以看到,前序遍历在第一次遇见元素时输出,中序遍历在第二次遇见元素时输出,后序遍历在第三次遇见元素时输出。非递归算法实现的基本思路:使用堆栈一、前序遍历1、递归实现遍历过程为:访问根结点;先序遍历其左子树;先序遍历其右子树。void ProOrderTraverse(BiTree tre...原创 2018-10-17 20:53:01 · 26983 阅读 · 14 评论 -
斐波那契查找
数组总长度为F[K]-1,mid前面长度为F[K-1]-1,后面长度为F[K-2]-1,mid在黄金分割点。#include&lt;iostream&gt;using namespace std;const int max_size = 20; //斐波那契数组的长度 void Fibonacci(int *F) //构造一个斐波那契数组{ F[0] = 0;...原创 2018-09-22 00:08:10 · 4964 阅读 · 1 评论 -
二叉排序树(BST)的创建,查找,插入,删除及最大最小结点
数组总长度为F[K]-1,mid前面长度为F[K-1]-1,后面长度为F[K-2]-1,mid在黄金分割点。#include&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;using namespace std;const int max_size = 20; //斐波那契数组的长度原创 2018-09-21 00:31:24 · 16814 阅读 · 4 评论 -
顺序查找 二分查找 插值查找
基本思路:首先将给定的关键字key与表array的中间位置的元素进行比较。如果相等,则查找成功,如果不相等,则查找的元素一定在表的前半部分或者后半部分。继续缩小范围到前半部分或者后半部分再进行同样的查找,直到找到为止,或者查完之后仍然没有找到元素。情况一:表array为容器#include&amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;gt;#include&amp;amp;amp;原创 2018-09-17 16:58:21 · 451 阅读 · 0 评论 -
二叉树的层序遍历
1、原理介绍层序遍历:若树为空,则空操作返回;若不为空,从树的第一层,也就是根节点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对节点逐个访问。 下图所示的例子,按照层序遍历,遍历顺序为:ABCDEFGHI。 思路:用队列解决,先进先出!从上到下,从左到右依次将每个数放入到队列中,然后按顺序依次打印就是想要的结果。 !!!注意:队列中每个节点应该是存储一个二叉树的指针,这...原创 2018-07-29 00:22:49 · 640 阅读 · 0 评论 -
模式匹配算法
算法一:朴素的模式匹配算法假设我们要从主串s="goodgoogle"找到t="google"这个子串的位置,我们需要下列步骤1、主串s的第1位开始,s与t前三个字符都匹配成功,第四个字符不匹配(竖线表示相等,闪电状弯折表示不想等)2、主串s的第2位开始,匹配失败3、主串s的第3位开始,匹配失败4、主串s的第4位开始,匹配失败5、主串s的第5位开始,s与t,6个字符全部匹配...原创 2018-06-29 17:33:01 · 25644 阅读 · 2 评论