数据结构
文章平均质量分 66
lym152898
这个作者很懒,什么都没留下…
展开
-
数组(Array)
数组的定义:由连续整数标号的相同元素组成的连续存储空间。数组的特点:(随机存储) 读时间复杂度为常数 写时间复杂度为常数读写的时间复杂读为常数的原因:编译器可以直接通过运算获得索引对应元素的地址。 一维数组:a[i]的地址为: &a[1] = array_addr + elem_size * (i - first_index)二维数组:a[i][j] 的地址: &a[i][j原创 2016-06-27 22:51:12 · 749 阅读 · 0 评论 -
平衡二叉树
概念平衡二叉树是一棵空树,或者是具有以下性质的二叉查找树:它的左子树和右子树都是 AVL树左子树和右子树的高度差的绝对值不超过1也就是说如果结点N是叶子结点时: N.Height = 1否则 N.Height = 1 + max(N.Left.Height, N.Right.Height)性质如二叉树的结点N满足AVL树的性质,且h = N.Height,那么N结点的子树的结点树至原创 2016-07-19 16:42:31 · 542 阅读 · 0 评论 -
线性表的C语言实现
函数声明头文件:function.h#define true 1#define false 0/* 定义链表的数据类型为int型 */typedef int datatype;/*线性表的单链表存储结构*/typedef struct l_node{ /*声明数据域*/ datatype data; /*声明指针域*/ struct l_node *next原创 2016-08-07 00:01:57 · 1529 阅读 · 0 评论 -
静态链表和循环链表
静态链表所谓静态链表,与指针型描述的链表(动态链表)的区别在于静态链表借用一维数组来描述链表.这种存储类型需要预先分配一个较大的空间.其结构如下图: 与动态链表操作时最大的区别在于: 静态链表需由用户自己实现malloc和free函数.为了辨明数组中哪些分量未被使用,解决的办法是:将所有未被使用过的以及被删除的分量用游标链成一个备用的链表,每当进行插入时便可从备用链表中取得第一个结点作为待原创 2016-08-07 01:13:39 · 1499 阅读 · 0 评论 -
c语言实现字符串
串的基本概念串 ( 字符串 ) :是零个或多个字符组成的有限序列。 记作: S=”a1a_1a2a_2a3a_3a4a_4…” ,其中 S 是串名, aia_i (1 ≦ i ≦ n) 是 单个,可以是字母、数字或其它字符。 串值:双引号括起来的字符序列是串值。 串长:串中所包含的字符个数称为该串的长度。 空串 ( 空的字符串 ) :长度为零的串称为空串,它不 包含任何字符。 空格串原创 2016-08-21 01:16:58 · 4415 阅读 · 0 评论 -
c语言单链表实现多项式计算
多项式链表的结构和接口均参考严蔚敏老师的(c语言版)《数据结构》。加法的实现: 假设指针pa,pb分别指向多项式A和B当前进行比较的某个结点,则比较这两个结点的指数项,有下列三种情况:指针pa所指结点的指数值 < 指针pb所指结点的指数值:则应摘取pa指针所指结点插入到“和多项式”链表中去指针pa所指结点的指数值 < 指针pb所指结点的指数值:则应摘取pb指针所指结点插入到“和多项式“链表中去原创 2016-08-09 20:21:52 · 8444 阅读 · 1 评论 -
串的模式匹配
基本概念字串的定位操作通常称作模式匹配(其中子串成为模式串),是各种串处理系统中的重要操作之一. 在博文c语言实现字符串中给出了定位函数int string_index(h_string S, h_string T, int pos)的一种算法.该算法的基本思路: 从主串S的第pos个字符起和模式串T的第一个字符比较,若相等,则继续逐个比较后续字符;否则从主串S的下一个字符起再重新和模式串T的字原创 2016-08-22 13:26:40 · 2907 阅读 · 3 评论 -
栈的c语言实现
栈的基本概念栈是限定仅在表尾进行插入或删除的操作.因此,对于栈来说,表尾端有其特殊的含义,称为栈顶(top),相应的表头端称为栈底(bottom).不含元素的空表称为空栈. 栈的修改是按照后进先出的原则进行的,又成为LIFO结构.插入元素的操作称为入栈,删除栈顶元素的操作成为出栈.栈的基本操作有:插入删除初始化判空取栈顶元素清除栈销毁栈遍历栈栈的长度栈的表示和实现栈有两种表示方原创 2016-08-11 14:04:00 · 1778 阅读 · 0 评论 -
c语言栈实现括号匹配
在文字处理软件或编译程序设计时,常常需要检查一个字符串或一个表达式中的括号是否相匹配? 匹配思想:从左至右扫描一个字符串(或表达式),则每个右括号将与最近遇到的那个左括号相匹配。则可以在从左至右扫描过程中把所遇到的左括号存放到堆栈中。每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该左括号。 算法思想:设置一个栈,当读到左括号时,左括号进栈。当读到右括号时,则从栈中弹原创 2016-08-12 03:02:41 · 18495 阅读 · 2 评论 -
c语言栈实现表达式求值
算术四则运算规则先乘除,后加减从左算到右先括号内后括号外表达式组成任何一个表达式都有操作数、运算符和界定符组成。操作数即可以是常量,也可以是被说明为变量或常量的标识符。运算符可以分为算术运算,关系运算和逻辑运算符。界定符有左右括号和结束符等。若把运算符和界定符统称为算符,他们构成的集合命名为OP.则任意两个相继出现的算符a和b之间的有限关系至多是下面的三种之一:a < b a的优先权高原创 2016-08-12 17:03:20 · 15353 阅读 · 3 评论 -
队列及其c语言实现
队列的基本概念队列 (Queue) :也是运算受限的线性表。是一种先进先出 (First In First Out ,简称 FIFO) 的线性表。只允许在表的一端进行插入,而在另一端进行删除。 队首 (front) :允许进行删除的一端称为队首。 队尾 (rear) :允许进行插入的一端称为队尾。队列中没有元素时称为空队列。在空队列中依次加入元素 a 1 , a 2 , …, a n 之后, a原创 2016-08-14 00:31:34 · 22407 阅读 · 11 评论 -
哈希表(二)
电话簿 设计一种数据结构来存储联系方式:包含人名和电话号码 这种数据结构应该可是快速实现以下操作: 添加和删除联系人 使用人名查找电话号码 通过电话号码确定打电话的人的姓名要实现上述操作,我们需要实现两种映射关系: 电话号码——>名字 名字——>电话号码首先,实现由电话号码到名字的映射方法: 1.直接寻址 把电话号码转换成整数.例如:int(123-45-67原创 2016-07-08 21:45:26 · 1474 阅读 · 0 评论 -
哈希表(一)
哈希表的应用 编程语言 文件系统 密码验证 存储优化IP地址IP地址表分析 分析登陆日志,迅速获得登陆服务器的ip情况:昨晚有没有登陆服务器?登陆的次数?一个小时之前有多少人登陆了服务器?#1个小时之内的登陆量可能有数百万次 #一个问题接着一个问题处理会很慢 #计数:一个小时之前每个ip登陆服务器的次数 #C是存储ip地址到计数器映射的特殊数据结构伪代码分析:lo原创 2016-07-08 18:08:24 · 673 阅读 · 0 评论 -
二叉查找树
局部搜索定义:一个局部搜索数据结构存储一系列元素,每个元素具有对应的一个键值,这些键值属于某个具有一定顺序的集合.它支持以下操作:RangeSearch(x, y):返回所有在x,y之间的数NearestNiborghbors(z):返回键值和z最相近对应的元素Insert(x):添加键值为x的元素Delete(x):删除键值为x的元素由于哈希表,数组,排序数组,链表不能实现上述操作(有的原创 2016-07-19 12:38:17 · 526 阅读 · 0 评论 -
单链表
结点的组成键值指向下一结点的指针单链表使用的API#时间复杂度中有关对尾部操作的函数的时间复杂度粗体为有尾部的情况 API 说明 时间复杂度 PushFront(key) 在链表首部插入元素 O(1) key TopFront()key 返回链表首部元素 O(1) PopFront() 删除链表首部元素 O(1) PushBack(key)原创 2016-06-28 10:18:24 · 681 阅读 · 0 评论 -
哈希表(三)
字符串搜索(搜索模板) 给定一个文本T(书,网站,简介)和一个模板P(字,短语,句子),找出P在T中出现的次数例子 在网站中寻找自己的名字 在推特消息中寻找自己的公司 检测被病毒感染的文件——代码模板字串标示 使用S[i…j]标示字符串S从位置i到j的字串输入:字符串T和P 输出:所有P在T中出现的位置i,其中0 <= i <= |T| - |P|,T[i..i+|P|-原创 2016-07-10 08:19:48 · 550 阅读 · 0 评论 -
父母结点数组表示的树的高度
父母结点表示树数组索引号对应的值是该索引号的父母结点 例如:parent = [-1 0 0 0 1 1 3 3 2]数组表示的树为:两种方法求该树的高度方法一此方法为简单方法,时间复杂度为:O(n^2),主要思路为:从索引号0开始,求对应索引号在树中的高度,取较大值,然后求索引号1的高度,取较大值,依次循环遍历所有的结点,即可得到树的高度。python实现# n为树的结点总数def tree_原创 2016-06-29 10:45:06 · 2449 阅读 · 0 评论 -
哈希表(四)
离散哈希表 网上存储系统 有时候上传一个大文件到网盘会很快,这是怎样实现的?新文件上传 需要确定网盘上是否已经存在相同的文件方法 1.一般比较方法 上传新文件 遍历所有已经存储的文件 一个字节接一个字节的和每一个已存在的文件比较 如果存在和新文件相同的文件,存储该文件的链接,而不存储新文件缺点 一定要先上传新文件 时间复杂度为O(NS),其中S为比较原创 2016-07-10 12:42:46 · 509 阅读 · 0 评论 -
优先队列(priority queue)
定义优先队列是一种支持以下主要操作的抽象数据结构: Insert(p):添加一个带有优先权p的新元素 ExtractMax():取出具有最大优先权的元素其他操作: Remove(it):删除it迭代器指向的一个元素 GetMax():返回具有最大优先权的元素(不改变元素集合) ChangePriority(it,p):把it迭代器指向的元素权限改为p使用优先队列的算法Dijsktr原创 2016-06-29 18:05:00 · 991 阅读 · 0 评论 -
伸展树
概念伸展树是一种二叉查找树,具有二叉查找树的性质.而与二叉查找树相比,伸展树具有的特点是:当某个节点被访问时,伸展树会通过旋转使该节点成为树根。伸展树操作的时间复杂度较低的原因是:把访问频率高的结点放在根节点附近伸展树的旋转算法伸展树的重点在与旋转算法,有三种旋转类型:zigzig-zigzig-zag设有结点x,p是x的父母结点,g是p的父母结点zig:当p是根节点,旋转类型为zigzig原创 2016-07-19 18:23:49 · 1595 阅读 · 0 评论 -
不相交集合
定义不相交集合数据结构支持以下操作: 1.MakeSet(x):创建一个单元素集合{x} 2.Find(x):返回包含元素x的集合的ID号 3.Union(x, y):融合包含x元素的集合和包含y元素的集合一般实现为了简单起见,假定我们的n个对象全都是整数1,2,3,4,…,n 1.使用最小元素当做集合的ID号 2.使用smallest[1…n]数组:smallest[i原创 2016-06-30 20:39:02 · 964 阅读 · 0 评论 -
伸展树的python实现
我的代码片:https://code.csdn.net/snippets_manage# 定义顶点class Vertex: def __init__(self, key, sum, left, right, parent): (self.key, self.sum, self.left, self.right, self.parent) = (key, sum, left原创 2016-07-25 10:16:29 · 852 阅读 · 0 评论 -
搜索二叉树的python实现
我的代码片:https://code.csdn.net/snippets_manage''' 功能:在二叉搜索树中查找一个元素,若该元素存在则返回该元素,否则返回该元素若存在时的父母结点 参数: key:结点的键值 root:二叉树的根节点'''def Find(key, root): # 若该树为空树或者根节点的键值等于key,则返回原创 2016-07-25 10:19:43 · 1007 阅读 · 0 评论 -
平衡搜索二叉树的python实现
我的代码片:https://code.csdn.net/snippets_manage# BST为二叉搜索树的实现文件import BST''' 功能:往平衡二叉树中插入一个结点 参数: N:要插入的结点'''def BInsert(N): # 调用二叉树的插入函数插入元素 BST.Insert(N) # 找出刚插入的元素,更新结点的高原创 2016-07-25 10:22:08 · 3038 阅读 · 0 评论 -
循环队列——队列的顺序表示和实现
前面分析顺序队的时候,我们知道,顺序队存在”假溢出”的问题,这个问题有时会造成很大的内存浪费,循环队列就是为了解决这个问题而提出地一个很巧妙的办法.循环队列和顺序队列的主要区别在于:循环队列将顺序队列臆造成一个环状空间.在操作上这种异同体现在: 相同点:在顺序队列和循环队列中,进行出队、入队操作时,队首、队尾指针都要加 1 ,朝前移动。 不同点: 1. 在循环队列中当队首、队尾指针指原创 2016-08-14 16:59:36 · 5662 阅读 · 0 评论