数据结构
文章平均质量分 86
koudaidai
这个作者很懒,什么都没留下…
展开
-
看图理解单链表的反转
如何把一个单链表进行反转?方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。方法2:使用三个指针遍历单链表,逐个链接点进行反转。方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。 方法1:浪费空间。 方法2:使用p和q连个指针配合工作,使得两个节点间的指向反向,同时用r记录转载 2012-03-15 11:12:29 · 775 阅读 · 0 评论 -
二项堆
总结:这一章介绍了二项树、二项堆,并介绍了二项堆的搜索、删除、插入等操作,二项堆比二叉堆的优势就是二项堆的合并的复杂度只有O(lgn),而二叉堆合并的复杂度在最坏情况下有O(n),因此若进行合并操作,二项堆的性能就比二叉堆要好了。 1. 二项树一个二项堆由一组二项树构成。二项树是一种递归定义的有序树,二项树B0只包含一个结点,二项树Bk由两颗二项树Bk-1链接而成:其中一颗树转载 2012-02-20 10:11:41 · 814 阅读 · 0 评论 -
堆
1. 概述堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。堆结构是一类很重要的数据结构,特别是在实现优先队列方面。堆结构实际上都是树(或森林),不过按节点的存储方式又可以分为两种顺序存储这种情况下,必须保持是完全树。 (在插入,删除后及时调整)可原创 2012-03-19 10:42:57 · 759 阅读 · 0 评论 -
算法导论——第八章——散列表
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。具体的介绍网上有很详细的描述,如闲聊哈希表 ,这里就不再累述了;哈希表在像Java、C#等语言中是与生俱来的。可是在C的世界中,似乎只有自己动手,丰衣足食;在网上google了一把,大致有几个版本,我会一一来分析原创 2011-12-05 18:37:51 · 1543 阅读 · 0 评论 -
哈希表的C实现
上次大致分析了一下哈希表的链地址法的实现,今天来分析一下另一种解决哈希冲突的做法,即为每个Hash值,建立一个Hash桶(Bucket),桶的容量是固定的,也就是只能处理固定次数的冲突,如1048576个Hash桶,每个桶中有4个表项(Entry),总计4M个表项。其实这两种的实现思路雷同,就是对Hash表中每个Hash值建立一个冲突表,即将冲突的几个记录以表的形式存储在其中;废话不多说,上代转载 2012-03-20 10:31:18 · 1059 阅读 · 0 评论 -
二叉树
二叉树(Binary Tree)是另一种树型结构,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的字数由左右之分,顺序不可颠倒。 二叉树的存储结构:1.顺序存储结构 (仅适用于完全二叉树) 2.链式存储结构 二叉树的遍历: 先序遍历二叉树的操作定义为: 若二叉树为空,则空操作;否则原创 2012-05-02 11:28:50 · 572 阅读 · 0 评论 -
红黑树原理
红黑树的平衡红黑树首先是一棵二叉查找树,它每个结点都被标上了颜色(红色或黑色),红黑树满足以下5个性质:1、 每个结点的颜色只能是红色或黑色。2、 根结点是黑色的。3、 每个叶子结点都带有两个空的黑色结点(被称为黑哨兵),如果一个结点n的只有一个左孩子,那么n的右孩子是一个黑哨兵;如果结点n只有一个右孩子,那么n的左孩子是一个黑哨兵。4、 如果一个结点是红的,则它的两个儿子都是转载 2012-05-02 20:32:50 · 3240 阅读 · 0 评论 -
红黑树代码
总结:这章介绍了红黑树的性质、旋转,并详细介绍了红黑树的插入和删除。 1. 红黑树的性质1) 每个节点或是红的,或是黑的2) 根节点是黑的3) 每个叶节点(NIL)是黑的4) 如果一个节点是红的,则它的两个儿子都是黑的5) 对每个节点,从该节点到其子孙节点的所有路径上包含相同数目的黑节点。 黑高度:从某个节点x出发到大一个叶节点的任意一条路径上,转载 2012-02-20 10:15:15 · 1318 阅读 · 0 评论 -
字典树(Trie树)
1. trie基础 (1) 是什么?Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。 (2) 性质根节点不包含字符,除根节点外每一个节点都只包含一个字符从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串每个节点的所有子节点包含的字符都不相同 例如,单词序列a, to, tea, ted, ten, i,原创 2012-05-08 14:57:06 · 889 阅读 · 2 评论 -
用堆实现优先队列
堆的性质:1.一个是他是一个数组(当然你也可以真的用链表来做。)。2.他可以看做一个完全二叉树。注意是完全二叉树。所以他的叶子个数刚好是nSize / 2个。3.我使用的下标从1开始,这样好算,如果节点的位置为i,他的父节点就是i/2,他的左孩子结点就是i*2,右孩子结点就是i*2+1,如果下标从0开始,要复杂一点。4.他的父节点一定不比子节点小(我所指的是最大堆)。由这些原创 2012-05-04 10:08:47 · 670 阅读 · 0 评论 -
设计桟的min、push以及pop的时间复杂度都是O(1)
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。\brief 设计包含min函数的栈定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。这里给出整个栈的简单实现,使用链式栈,利用辅助栈提供min值查询。*/#inclu转载 2012-05-31 16:12:15 · 2239 阅读 · 2 评论 -
数据结构之树状数组
1、概述树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组{a}中的元素可能不断地被修改,怎样才能快速地获取连续几个数的和?2、树状数组基本操作传统数组(共n个元素)的元素修改和连续元素求和的复杂度分别为O(1)和O(n)。树状数组通过将线性结构转换成伪树状结构(线性转载 2012-05-24 21:55:52 · 602 阅读 · 0 评论 -
并查集
l 并查集:(union-find sets)一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。l 并查集的精髓(即它的三种操作,结合实现代码模板进行理解):1、Make_Set(x) 把每一个元素初始化为一个集合原创 2012-05-25 09:29:51 · 548 阅读 · 0 评论 -
斐波那契堆
总结:这一章讲了斐波那契堆,它是一种比二项堆更松散的堆,它由一组无序的二项树组成,对不涉及删除元素的操作,它仅需O(1)的平摊运行时间。本章介绍斐波那契堆的插入、合并、删除等操作。 1. 斐波那契堆的结构每个结点x的域:1) 父节点p[x]2) 指向任一子女的指针child[x]3) 左兄弟left[x]4) 右兄弟right[x]5) 子女的个数d转载 2012-02-20 10:12:32 · 1294 阅读 · 0 评论 -
AVL树
1. 概述AVL树是最早提出的自平衡二叉树,在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis。AVL树种查找、插入和删除在平均和最坏情况下都是O(log n),增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。本文介绍了AVL树的设计思想和基本操作。2. 基本术语有四原创 2012-03-19 11:06:44 · 801 阅读 · 0 评论 -
二叉查找树
大家都知道,树的定义本身就带有递归性。因此,树的很多操作都涉及到了递归。二叉查找树的定义如下:1.二叉查找树首先是一棵二叉树;2.二叉查找树除了是二叉树外,还具有以下性质:对于树中的任何一个节点X,其左子树中的所有节点的关键字均小于X的关键字的值;而其右子树中的所有关键字的值均大于X的关键字的值。下面两棵二叉树中,左边的二叉树是二叉查找树而右边的不是。二叉查找树的数据结构定义如原创 2012-03-19 10:57:18 · 592 阅读 · 0 评论 -
线性表
一、相关术语 线性表、直接前驱、直接后继、顺序表、链表、指针、指针变量 、结点、数据域、 单向链表、单向循环链表、双向循环链表、插入、删除 二、线性表的定义及特点 线性表(linear_list)是属于同一个数据对象的数据元素的有限序列。通常表示为: (a1, a2 ,a3,…,an) 其中n为线性表的长度,当n=0时,表示一个空表。 线原创 2012-03-15 10:43:03 · 1702 阅读 · 0 评论 -
单链表建立,插入,删除,查找,遍历操作
单链表建立,插入,删除,查找,遍历操作// Link.cpp : 定义控制台应用程序的入口点。//单链表#include "stdafx.h"#include #include using namespace std;typedef struct node { int data;//节点内容 node *next;//下一个节点}node;//创建单链表node *c原创 2012-03-15 14:43:17 · 5159 阅读 · 1 评论 -
约瑟夫环算法(循环链表解决)
问题:约瑟夫环 有编号从1到N的N个人坐成一圈报数,报到M的人出局,下一位再从1开始, 如此持续,直止剩下一位为止,报告此人的编号X。输入N,M,求出X。#include struct node{ int v; struct node *next;}*p,*head,h; //head是头指针,h是头结点main(){ int n,m;原创 2012-03-15 18:50:06 · 1664 阅读 · 1 评论 -
数据结构——栈
数据结构——栈 栈(stack)是一种常用的重要数据结构,由于其具有后进先出(last in first out,LIFO)的特性,又被叫做后进先出线性表。 基本术语: 栈顶(top):栈中允许插入和删除的一端叫做栈顶。 栈底(bottom):不允许插入和删除的另一端。 入栈/压栈:指向栈中添加元素的操作。 出栈/弹栈:指删除栈顶元素的操作原创 2012-03-15 19:36:06 · 707 阅读 · 0 评论 -
链表相交
给定两个单链表,表头分别为head1和head2.判断两个链表是否相交,如果不相交返回null,如果相交,则给出相交的第一个交点。对题目进行简单分析后不难得出,因为链表的特殊存储结构,使得其在存储结构上如果交叉则一定为“Y”型或者为“V”型,不可能为“X”型。所以相交只需求出第一个交点。算法具体实现可以如下public Node FindSameNode(Node head1, Nod原创 2012-03-15 19:08:40 · 930 阅读 · 0 评论 -
数据结构——栈应用
一、算术表达式的中缀表示把运算符放在参与运算的两个操作数中间的算术表达式称为中缀表达式。例如:2+3*4 – 6/9算术表达式中包含了算术运算符和算术量(常量、变量、函数),而运算符之间又存在着优先级,不能简单地进行从左到右运算,编译程序在求值时,不能简单从左到右运算,必须先算运算级别高的,再算运算级别低的,同一级运算才从左到右。在计算机中进行中缀表达式求值较麻烦。而后缀表达式求值较方便(原创 2012-03-16 10:50:31 · 803 阅读 · 0 评论 -
双链表
在单链表中,NextElem的执行时间为O(),而PriorElem的执行时间为O(n)。为了克服这个单向性的缺点,可利用双向链表。在双链表的结点中有两个指针域,其一指向直接后继,另一指向直接前驱。功能:(1) 初始化双链表InitList(DLinkList *&L);(2) 采用尾插法插入a,b,c,d,e元素Destro原创 2012-03-15 16:04:11 · 1177 阅读 · 0 评论 -
栈的应用之平衡符号
之前学习了栈的基本操作,并且学习了栈的两种实现方式:链式存储和顺序存储(数组)。现在看看栈都有哪些应用。栈的一个主要应用是平衡符号。 初学者在编写代码并且编译时,难免会因为少写了一个')'和被编译器报错。也就是说,编译器会去匹配括号是否匹配。当你输入了一个'(',很自然编译器回去检查你是否有另一个')'符号与之匹配。如果所有的括号都能够成对出现,那么编译器是能够通过的。否则编译器原创 2012-03-18 16:47:30 · 1275 阅读 · 0 评论 -
栈的应用之函数调用
理解调用栈最重要的两点是:栈的结构,EBP寄存器的作用。首先要认识到这样两个事实:1、一个函数调用动作可分解为:零到多个PUSH指令(用于参数入栈),一个CALL指令。CALL指令内部其实还暗含了一个将返回地址(即CALL指令下一条指令的地址)压栈的动作。2、几乎所有本地编译器都会在每个函数体之前插入类似如下指令:PUSH EBP; MOV ESP EBP;即,在程序执行到一个函原创 2012-03-18 16:56:51 · 827 阅读 · 0 评论 -
队列及实现、循环队列实现
一、队列 队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。原创 2012-03-18 17:10:05 · 712 阅读 · 0 评论 -
B树
总结:本章介绍了B树,并介绍了B树中搜索,插入,删除,分裂的算法。 1. B树的定义B树是与红黑树类似的一颗平衡查找树,但在降低磁盘I/O操作次数方面要更好一些。B树的性质:1) 每个节点x的域:a) n[x],x中的关键字数,若x是B树中的内节点,则x有n[x]+1个子女。b) n[x]个关键字本身,以非降序排列,key1[x]2转载 2012-02-20 10:14:21 · 557 阅读 · 0 评论 -
二叉树恢复解析
以前做这种题蛮熟练的,放了两个学期没管它,今天再来做就太.......伤脑子了不过还好,还是想起怎么做了这里把我的方法分享给大家,希望还不会的朋友能有所收获,也希望能得到更好的解决办法【题目】假设一棵二叉树的后序遍历序列为 DGJHEBIFCA ,中序遍历序列为 DBGEHJACIF ,则其前序遍历序列为 ( ) 。A. ABCDEFGHIJB. ABDEGHJ转载 2012-10-10 13:34:01 · 950 阅读 · 0 评论