数据结构
文章平均质量分 72
Tander_Tang
喜欢数学,喜欢算法,喜欢编程,喜欢计算机。
展开
-
散列表
1.直接寻址法:当关键字的全域U很小时,直接寻址法是一种简单而有效的技术。设集合U={0,1,2...m-1},我们用一个数组或叫直接寻址表记为T[0...m-1],数组每一个位置对应U中的一个关键字。T[k]存放关键字K,若集合中没有k关键字则T[k]=NIL; 直接寻址法缺点非常明显:如果全域U非常大,可能就存不下直接寻址表T,如果实际存储关键字太少,也可能造成大量空间的浪费。原创 2016-03-01 15:05:14 · 405 阅读 · 0 评论 -
hdu 1232畅通工程
这是一个比较简单的并查集题目。我们把每一片城区看做一个集合(图的一个连通集),然后统计一共有k个集合,连接两个集合需要1条边,从而整个需要 k-1条边。#includeusing namespace std;#define MAX_SIZE 1000int parent[MAX_SIZE];int findParent(int i);void Union(int i, int j);i原创 2016-03-23 17:40:16 · 299 阅读 · 0 评论 -
DFS与BFS
1.深度优先搜索(DFS) 深度优先搜索类似于树的先序遍历,是树的先序遍历的推广。在图是连通的情况下,可以从图的任意v一顶点出发,访问该顶点,然后依次从v的没有被访问的邻接点进行同样的深度优先搜索。访问时需要定义一个布尔数组 visite[ i ]来记录第i个顶点是否访问过。递归和非递归代码如下:void DFS(int i){ visit[i] = true; //访原创 2016-03-22 14:02:40 · 380 阅读 · 0 评论 -
并查集
在一些有N个元素构成的一些单元素的集合,需要反复查找一个元素在哪一个集合中,判断两个数是否属于同一个集合,以及合并两个集合。并查集是一种树型的数据结构。用于处理不相交的集合( disjoint sets)的合并以及查询问题。在使用时用森林表示。如集合A={0,1,3,6} , B={ 2,4 7} , C={5,8,9}其A,B,C分别构成三棵树,A,B,C共同构成一个森林,并查集一般用数组存原创 2016-03-10 16:36:47 · 268 阅读 · 0 评论 -
图的存储
1.邻接矩阵 一维数组存储顶点信息,用二维数组存储边信息。空间复杂度为O(n^2),无向图的邻接矩阵一定是对称的,它的第i行或者第i列不为0或者∞的元素个数正好是 顶点 i或者j的度。用邻接矩阵很容易知道两条边之间是否有边相连,而且也很直观简单。但是要确定图中有多少条边的时间复杂度是O(n^2),在存储稀疏图时还会浪费大量的空间,这是邻接矩阵的局限性。2.邻接表 邻接表是原创 2016-03-21 23:01:06 · 447 阅读 · 0 评论 -
图论基本定义和术语
1.图的定义 图(Graph)是由两个集合构成,一个是非空但是有限的顶点集合V,另一个是描述结合间的关系边的集合E,因此图可以表示为G=(V,E).每条边是一对顶点(v,w)且 v,w∈V.通常|V|和|E|表示顶点个数和边的数量。值得注意的是图中顶点一定不能为空,而边可以为空。 2.图的相关术语 1)无向图:无向图是指图中的边没有方向性即边(v,w)与边(原创 2016-03-21 20:53:55 · 12568 阅读 · 0 评论 -
单源最短路径Dijstra算法
Dijstra算法是寻找从某一顶点i出发到大其他顶点的最短路径。Distra算法的思想与Prim算法很像,它收录顶点的规则是按照路径长度递增的顺序收录的。设v0是源顶点,我们要寻找从v0出发到其他任意一点的最短路径。设已经求解的顶点(已经找到从v0出发到达该顶点最短路径的顶点)组成的集合是S={v0,v1,...vk};在收录下一个顶点v的时候要么是(v0,v),要么是(v0,vj,v);如果是后原创 2016-03-30 23:00:13 · 1759 阅读 · 0 评论 -
统计一篇短文中单词出现频率
散列查找的应用:给定一个英文文本文件,统计文件中所有单词出现的频率。解决这问题最基本的工作是不断地对读入的单词在已有的单词中查找,如果存在就将该单词频数加1,如果不存在就将该单词插入并记录频数为1.下面C++代码的哈希函数使用了双重探测的办法。在确定表的时候是取比输入整数小且距离输入整数最近的素数。#include#include#include#include#includeu原创 2016-03-05 18:05:02 · 1161 阅读 · 0 评论 -
二叉搜索树基本数据结构实现
二叉搜索树基本数据结构实现,非递归与递归。二叉搜索树中一个结点包含3个指针left,right, prev和一个卫星数据key。这三个指针分别指向左儿子,右儿子,父节点。如果孩子结点和父亲结点不存在,相应指针为空。根结点的prev指向空。 1)遍历(中序遍历,先序遍历,后续遍历) 2)查找一个关键字,返回该关键字的结点指针 3).返回最大关键字最小关键字结点指针 4)寻找关键字key的后继结点原创 2016-03-04 14:49:37 · 475 阅读 · 0 评论 -
两个栈模拟一个数列
问题:如何使用两个栈实现一个数列,并写出入队和出队的函数。栈是后进先出,队列是先进先出。为了模拟先进先出,可以使用两个栈A,B,A栈专门管理入队的元素,B栈专门管理出队的元素。比如要将将1 2 3 4 5入队,则全部压入A中,此时A:1 2 3 4 5。如果要出队,则将A中先全部导入到B中,此时B :5 4 3 2 1 ,这时候再从B栈中出来的就是队列出队的顺序。#include#inclu原创 2016-02-29 12:49:24 · 429 阅读 · 0 评论