[置顶] 散列表(下)——分离链接法

概述在我的上一篇博客散列表(上)——开放定址法 主要讲述了开放定址法的三种思路:线性探测法,平法探测法,双散列法三种思路,以及线性探测的代码实现。在这篇博客里,主要讲解第二中解决冲突的办法——分离链接法。分离链接法分离链接法的思想就是:将相应位置上冲突的所有关键词存储在同一个单链表中。主要办法是,构造以所有可能地址的为头的单链表数组。对于单链表的相关操作已经在之前的博客详细讲述了,如有需要请移步我之...
阅读(145) 评论(0)

[置顶] 散列表(上)——开放定址法

概述散列表,又称哈希表,hash表。散列表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。这个源于散列表设计的特殊性,它采用了函数映射的思想将记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找。设计思想Hash表采用一个映射函数 f : key —> address 将关键字映射到...
阅读(220) 评论(0)

[置顶] 拓扑排序

概述拓扑排序:如果图中从v到w有有一条有向路径,则v一定要排在w之前。满足此条件的顶点序列称为一个拓扑序。获得拓扑序的过程就是拓扑排序。有向无环图:一个有向图中不存在环,则称为有向无环图,简称DAG(Directed Acyclic Graph)。AOV网络:如果用DAG图买表示一个工程,其顶点表示活动,用有向边拓扑排序算法思想:从图从选择一个没有前驱结点的顶点输出,之后删除该顶点和所有以它为起始点...
阅读(80) 评论(0)

[置顶] 最小生成树算法(下)——Kruskal(克鲁斯卡尔)算法

概要在我的上一篇文章最小生成树算法(上)——Prim(普里姆)算法 主要讲解对于稠密图较为合适的Prim算法。那么在接下里这片文章中我主要讲解对于稀疏图较为合适的Kruskal算法。Kruskal算法Kruskal算法思想概述: 如果说Prim算法可以用让一颗小树慢慢长大,那么Kruskal算法也可以用一句话来总结:将森林合并成树。就是说它比Prim算法更直接的贪心,把每个顶点看成一棵树,那么恶...
阅读(111) 评论(0)

[置顶] 最小生成树算法(上)——Prim(普里姆)算法

概述最小生成树:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。根据定义可知对于一个有V个顶点的图来说,其最小生成树定包含V个顶点与V-1条边。反过来如果一个图的最小生成树存在,那么图一定是连通图。 对于最小生成树算法最著名的有两种:Prim算法与Kruskal算法。Prim算法Prim算法思想描述: Prim算法可以简单描述成...
阅读(200) 评论(0)

[置顶] 最短路径算法(下)——弗洛伊德(Floyd)算法

概述在这篇博客中我主要讲解最短路径算法中的Floyd算法,这是针对多源最短路径的一个经典算法。对于单源最短路径算法请详见我的另一篇博客:最短路径算法(上)——迪杰斯特拉(Dijikstra)算法弗洛伊德(Floyd)算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。算法思想与过程(一)算法思想: Flo...
阅读(1783) 评论(6)

[置顶] 最短路径算法(上)——迪杰斯特拉(Dijikstra)算法

概述单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。最短路径的最优子结构性质描述为:如果P(i,j)={Vi….Vk..Vs…Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。假设P(i,j)={Vi….Vk..Vs…Vj}是从顶...
阅读(435) 评论(0)

[置顶] 汉密尔顿回路问题

概述这是自己这学期算法课的实验作业。下面给出汉密尔顿图的定义。定义如下:对于连通图G=(V,E),V1,V2,…,Vn是G 的一条通路,且图中任意两个顶点都可达,若 中每个顶点在该通路中出现且仅出现一次,则称该通路为汉密尔顿通路。若 V1=Vn,则称该通路为汉密尔顿回路。算法描述1)初始化最佳路径数组best_path,同时初始化临时路径数组path与访问数组isvisited,设置最小长度min,...
阅读(359) 评论(0)

[置顶] 图的遍历(下)——邻接表

概述在我的上一篇博客:图的遍历(上)——邻接矩阵 中主要介绍了邻接矩阵的BFS和递归的DFS与非递归的DFS这3种遍历算法。在这篇博客我将主要叙述邻接表的以上3中遍历算法。首先来看看邻接表的表示方法。邻接表主要是针对稀疏图中邻接矩阵造成的空间浪费而提出的。下面我们来看看邻接表的表示。 1)无向图的表示 2)有向图 (说明:对于BFS,DFS的递归与非递归算法在这篇文章就不再重复,如有不了解...
阅读(132) 评论(0)

[置顶] 图的遍历(上)——邻接矩阵表示

概述图作为数据结构书中较为复杂的数据结构,对于图的存储方式分邻接矩阵和邻接表两种方式。在这篇博客中,主要讲述邻接矩阵下的图的深度优先遍历(DFS)与广度优先遍历(BFS)。广度优先遍历(BFS)BFS 算法的思想是:对一个无向连通图,在访问图中某一起始顶点 v 后,由 v 出发,依次访问 v 的所有未访问过的邻接顶点 w1, w2, w3, …wt;然后再顺序访问 w1, w2, w3, …wt 的...
阅读(124) 评论(0)

[置顶] 根据先序序列与中序序列构建二叉树

算法如下: 1)先在先序序列中找到根结点, 2)在中序序列中找到根结点位置,(可以将二叉树分为左子树和右子树) 3)用同样的办法构造左子树 4)用同样的办法构造右子树。//根据先序序列与中序序列构建二叉树 BinaryTree* Pre_In_Build(char* pre ,char* in, int size){ if(!pre || !in || size < 0){...
阅读(169) 评论(0)

[置顶] 从大到小输出二叉搜索树中键值不小于K的关键字

概要这是王道数据结构复习资料上的一道题。该书给出了递归算法,但是解析中对于非递归算法说使用非递归中序遍历的思路进行解答,这明显有错误。根据 二叉搜索树的性质可知,二叉搜索树的中序遍历是从小到大的序列,但是题意却是要从大到小输出,故需要采用右根左的遍历方式才能得到题意所要求的序列。算法如下:void FindK(BinarySearchTree* BST , int k){ stack<Bin...
阅读(272) 评论(0)

[置顶]

概念堆是一个用数组表示的完全二叉树,并满足以下两个特性: 1)父节点的键值总是大于或等于(小于等于)其子树上的任意结点 2)每个结点的左子树和右子树都是个堆。 如果父节点的键值总是大于等于任何一个子节点的键值,那么这时称之为最大堆或者大顶堆。反之,如果父节点的键值总是小于等于任何一个子节点的键值,那么这时称之为最小堆或者小顶堆。插入操作算法如下: 1)如果堆已满则不能插入 1)否则,把需要...
阅读(132) 评论(0)
    个人资料
    • 访问:78203次
    • 积分:3567
    • 等级:
    • 排名:第9575名
    • 原创:267篇
    • 转载:0篇
    • 译文:0篇
    • 评论:63条
    博客专栏
    最新评论