![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 69
xisuesuexi
这个作者很懒,什么都没留下…
展开
-
数据结构笔记(二)——表
个人学习笔记。C++可以使用struct和class,并且C++中与C中的struct不一样,它更像class。参考:https://www.cnblogs.com/ccsccs/articles/4025215.html线性表:由同类型数据元素构成有序序列的线性结构。包括数据对象集和操作集。一、顺序存储实现(数组实现)利用数组的连续存储空间顺序存放线性表各元素arr...原创 2018-10-12 18:21:31 · 328 阅读 · 0 评论 -
数据结构笔记(六)——散列(Hash Table)之分离链接法(2)
散列函数无法把所有的关键字散列到不同的位置,不可避免的会发生冲突,分离链接法是解决冲突的第一种方法。分离链接法的做法是将散列到同一个地址的关键字保留到一个表中,也就是每个位置分别对应了一个散列到该位置的表。 定义装填因子λ为散列表中元素个数与散列表大小的比值。分离链接法一般会使得表的大小和元素差不多(λ=1),...原创 2019-06-28 19:20:52 · 305 阅读 · 0 评论 -
数据结构笔记(六)——散列(Hash Table)之散列函数(1)
散列表(hash table)的实现叫做散列(hashing)。这是以常数平均时间O(1)进行插入、删除和查找的技术。散列表没有顺序,需要元素间排序信息的操作,如findMin、findMax不会得到有效支持(就是这东西不是这么用的,你可以实现,但效率不会很高)。理想情况下,散列表是一个包含关键字的具有固定大小的数组,数组大小一般被视为散列表的一部分。数据通过散列函数简单的计算映射到数组适当的位置...原创 2019-06-28 14:24:09 · 1001 阅读 · 0 评论 -
数据结构笔记(七)——左式堆/左偏树(leftist heap)(2)
前面二叉堆实现了优先队列基本的插入和删除最小元操作,但如果想要将两个堆合并的话就不太容易了,我们要把一个数组里的数据拷贝到另一个数组,如果数组1和数组2大小相同,那么合并操作的时间就是O(N)。果然合并还是需要指针呀,所以我们提出了左式堆,但是注意指针操作实际会比乘除运算更加耗费时间。左式堆(Leftist Heap)也有结构和有序性。左式堆的有序性和二叉堆一样,父亲小于所有的儿子。它不再是用...原创 2019-06-27 19:33:44 · 399 阅读 · 0 评论 -
数据结构笔记(七)——二项队列(binomial queue)(3)
左式堆将插入、合并和删除最小元的操作控制在O(logN),尽管时间已经够少了,但二项队列进一步降低了这个时间。二项队列(binomial tree)以最坏时间O(logN)支持以上操作,并且插入操作平均花费常数时间。二项队列不是一棵树,而是树的集合,称为森林,这里的树有特定的形式,同时也具有堆序性,叫做二项树(binomial tree)。如图为一个二项队列,有B0,B1,B2,B3,B4五棵...原创 2019-07-03 15:14:41 · 2498 阅读 · 2 评论 -
数据结构笔记(七)——二叉堆(Binary heap)(1)
这一章讲的是优先队列,实现优先队列有各种方式,二叉堆是比较常见的。系统管理中有的程序优先级比较高,有时我们要调整某个程序的优先级或者有时需要结束某个进程,这种操作无法借助队列(先进先出)完成。我们提出了优先队列(priority queue)。优先队列是至少允许insert(插入,类似于队列中的入队)和deleteMin(删除最小者,等价于队列中的出队,功能是找到、返回、删除队列中的最小元素)...原创 2019-06-26 20:51:23 · 316 阅读 · 0 评论 -
数据结构笔记(六)——散列(Hash Table)之双散列和再散列(4)
虽然平方探测排除了一次聚集,但散列到同一位置的元素仍然会探测相同的备选位置,比如当冲突函数为i^2时,对于每个要插入的X,其向前探测地步长都是0,1,4,9,16,这样对于散列到同一位置的X,他们都会探测相同的备选位置,这是二次聚集。双散列对平方探测法里面的冲突函数做了进一步的改进,F(i)进一步的复杂化,引入了另外一个函数,这个函数对每个X都会计算出一个值,而不是和二次函数一样探测同样的位置。比...原创 2019-07-01 20:15:03 · 5246 阅读 · 0 评论 -
数据结构笔记(五)——平衡查找树(AVLTree)(4)
AVL树是带有平衡条件的二叉查找树,这个平衡条件必须容易保持,而且必须保持树的深度是O(logN)。树,二叉树,二叉查找树,有这么多种树,我们一步一步给树这个结构添加限制条件,保证操作简单,复杂度不那么高。AVL树添加了平衡条件这一项,为什么呢?之前的二叉查找树存在的问题是一般情况下我们无法保证它的深度足够的小,虽然完全二叉树的深度logN确实够小了,但对一般的输入保持完全二叉树却不是简单的事...原创 2019-05-28 16:08:18 · 212 阅读 · 0 评论 -
数据结构笔记(五)——树(Tree)(1)
一、基本概念树:一棵树由根节点(root)和0个或多个非空的子树组成,连接这些子树和根的叫做边(edge)。子树与根的关系为儿子(child)和父亲(parent),以此可推出祖父,孙子之类的关系,父亲,祖父之类的都可以叫做(真)祖先,儿子,孙子都可以叫做(真)后裔,自己可以是自己的祖先或者后裔。树的大部分操作的平均运行时间为O(log N),定义、理解、实现树用递归。对于一棵...原创 2019-04-11 16:28:33 · 427 阅读 · 0 评论 -
数据结构笔记(五)——二叉查找树(Binary Search Tree)(3)
一、基本概念二叉查找树算是树里面比较常用而且重要的一类,二叉查找树相对于二叉树的不同之处在于,查找树中的每个节点X,它的左子树中的所有关键字要小于X的关键字值,而X的右子树中所有关键字的值大于X的关键字值。这种结构让二叉树按照一定的顺序排序,实现和搜索都会比较简单。二叉查找树的平均深度为O(log N)。二、二叉查找树的实现BSTree.h#pragma once#incl...原创 2019-04-11 16:29:16 · 351 阅读 · 0 评论 -
数据结构笔记(五)——二叉树构造表达式树,先序、中序、后序遍历输出(2)
一、基本概念二叉树(Binary Tree):每个节点不能有多于两个的儿子(<=2)。二叉树平均深度为O(N^1/2),当然深度最大值为N-1。具有N个节点的二叉树需要N+1个NULL指针(如果表示二叉树的结构为一个节点包括本身数据和指向它两个儿子的指针),可以这样去想:如果只有一个节点,那就有两个空指针,每增加一个节点都会占用一个空指针的位置,同时引入两个空指针,其实每增加一个...原创 2019-05-17 16:45:53 · 1804 阅读 · 0 评论 -
数据结构笔记(四)——队列(queue)
个人学习笔记。个人理解数据结构只是个概念,怎么实现完全看个人和项目 需求,可以用偏C语言的方式实现,也可以用C++中更偏向于类的方式,加上构造函数和析构函数等。看这些代码,和正常看C/C++代码一样看。因为之前有人问我一些问题,随便叨叨。队列同样算是表,它的特点是先进先出(FIFO)。一、数组实现队列这里用循环数组,队首留一个位置不存数据。QueueArray.h#pra...原创 2019-03-26 16:49:10 · 488 阅读 · 0 评论 -
数据结构笔记(三)——栈
栈算是一种表(list),但是它只能在表的末端(栈顶top)进行操作,栈的特点是后进先出(LIFO)。实现栈同样可以用链表和数组,一般大家比较喜欢用数组,避免了指针,而且没有分配内存的时间开销,不过需要事先声明数组大小,所有涉及到数组的都存在这个问题。一、用链表实现链表实现栈要记住的是表头为栈顶,因为稍微模拟一下就可以知道,如果把链表末尾当做栈顶,那么在出栈的时候栈无法指向这个结点的前...原创 2019-03-22 21:55:23 · 310 阅读 · 0 评论 -
数据结构笔记(一)——代码开题
个人学习笔记,不喜勿喷。1、空间使用:printN函数的实现。#include "stdafx.h"void printN(int n){ for (int i = 1; i <= n; ++i) { printf("%d\n", i); }}void printN(int n){ if (n>=1) { printN(n - 1); pri...原创 2018-10-10 15:20:53 · 203 阅读 · 0 评论 -
数据结构笔记(六)——散列(Hash Table)之开放定址法(3)
前一篇讲了分离链接法,它的实现简单易懂,但是分离链接法需要指针,需要实现链表,给新单元分配地址也需要时间,因此速度有所下降。这一节的开放定址法不用链表来解决冲突,而是当遇到冲突时,尝试选择其他位置,直到找到一个空位置。,且F(0)=0.函数F为冲突解决方法。可以看到,数据将会被全部放入表中(不会有一个额外的链表用来存储数据),装填因子λ应该低一点(<0.5),这样出现冲突的可能会稍低一点。...原创 2019-07-01 19:17:52 · 331 阅读 · 0 评论