数据结构学习阶段
黎晓舞指
这个作者很懒,什么都没留下…
展开
-
堆的构建 基本操作以及堆排序
最大堆和最小堆是二叉堆的两种形式。最大堆:根结点的键值是所有堆结点键值中最大者的堆。最小堆:根结点的键值是所有堆结点键值中最小者的堆。那么如何构建一个堆呢?我们这里主要看一下小堆的构建,以及关于堆的一些操作。首先建立一个堆://Heap.h文件#include<stdlib.h>#include<malloc.h>#include<string.h&g...原创 2019-01-18 17:41:23 · 324 阅读 · 0 评论 -
位图 ---- 应用以及实现
如果给你40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?遍历,时间复杂度O(N)排序(O(NlogN)),利用二分查找: logN位图解决 数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如:1.位图的概念所谓位图,就...原创 2019-10-05 16:47:05 · 408 阅读 · 0 评论 -
哈希 ---《哈希函数》------除数的选取为什么是质数?、《哈希冲突》------解决方法、《闭散列》、《开散列》
一、哈希概念顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较**。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(logN )**,搜索的效率取决 于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过 某种函数(hashFunc)使元素的存储位置与它的...原创 2019-10-03 17:52:16 · 3676 阅读 · 0 评论 -
哈希切割 ------ TOP K问题
题目:给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 与上题条件相同, 如何找到top K的IP?1.找出出现次数最多的IP地址最易想到的方法就是去遍历这个文件:使用嵌套的循环去统计每个IP地址出现的次数,最终找出出现次数最多的。这种方法可行,但有很大缺陷:首先100G的文件不可能一次性加载到内存,因此就需要对文件进行分割,而统计每...原创 2019-10-02 13:43:59 · 557 阅读 · 1 评论 -
红黑树----原理及详细实现过程
1.红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。2.红黑树的性质每个节点不是红色就是黑色根结点是黑色的如果一个结点是红色的,则它的两个孩子是黑色的对于每个节点,从该节点到其后代叶结点的简单路径上,均包...原创 2020-03-03 10:28:49 · 3370 阅读 · 0 评论 -
AVL树的实现
1.AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当 于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之 差的绝对值不超过1(需要对树中的结点进行调整),即可降低树...原创 2019-09-25 23:16:44 · 727 阅读 · 0 评论 -
二叉搜索树
二叉搜索树一、二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树例如下图为一个二叉搜索树:二、二叉搜索树操作1.二叉搜索树的查找插入的具体过程如下:设查找的值为a ;从根节点开始,若根节点...原创 2019-09-25 13:37:28 · 1303 阅读 · 0 评论 -
二、选择排序(直接选择排序、堆排序)
选择排序:**基本思想:每一在序列的起始位置,直到全部待排序的 数据元素排完 。1.直接选则排序:步骤如下:(1)在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素 。(2)若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换 。(3)在剩余的array[i]–array[n-2](array[i+1]–array[n...原创 2019-01-14 16:51:59 · 523 阅读 · 0 评论 -
一、插入排序算法(直接插入排序、希尔排序)
1.直接出现插入排序基本思想是:把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。**具体实现过程:**当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与 array[i-1],array[i-2],…的排序码顺序进行比较,找到...原创 2019-01-14 14:47:55 · 425 阅读 · 0 评论 -
链表 ---单向链表
讨论单链表之前,我们先来讨论下面这个问题。顺序表存在的一些问题:中间/头部的插入删除,时间复杂度为O(N)增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200, 我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。为了解决顺序表存在的这些问题,我们就要学习另外一种数据...原创 2019-09-09 21:12:05 · 503 阅读 · 0 评论 -
链表--- 双向链表及其实现
双向带头链表双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。实现代码如下:无头双向循环链表:接口:#include<stdio.h>#include<stdlib.h>#include<assert....原创 2019-09-09 21:49:19 · 258 阅读 · 0 评论 -
C语言 栈的接口实现
栈的概念栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。话不多说了解了栈的特点以后,直接看实现代码://Stack.h//栈的相关接口的...原创 2019-09-09 22:12:59 · 399 阅读 · 0 评论 -
C语言 队列的接口实现
1.队列的概念队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。2.队列的实现队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。队列实现代码如下:...原创 2019-09-09 22:32:41 · 304 阅读 · 0 评论 -
一、排序 ----- 插入排序(直接插入排序、希尔排序)
1.排序的概念及其运用1.1排序的概排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。内部...原创 2019-09-10 22:29:02 · 158 阅读 · 0 评论 -
三、 交换排序 (冒泡排序,快速排序---《hoare版本快排》、挖坑法、前后指针法)
交换排序基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。1.冒泡排序void BubbleSort(int* a,int n){ for(int i=0;i<n-1;i++) { for(int j=0;j<n-1-i;j++) //注意边界为...原创 2019-09-11 15:41:48 · 270 阅读 · 0 评论 -
四、归并排序、非比较排序 (归并排序、计数排序)
一、归并排序基本思想:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序核心步骤:看下图:归并排序实现代码如下:#include<stdi...原创 2019-09-11 17:14:32 · 154 阅读 · 0 评论 -
布隆过滤器 ---- 实现以及性能分析
我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看 过的内容。问题来了,新闻客户端推荐系统如何实现推送去重的? 用服务器记录了用户看过的所有历史记 录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。 如何快速查 找呢?1. 用哈希表存储用户记录,缺点:浪费空间。2. 用位图存储用户记录,缺点:不能处理哈希冲突。3....原创 2019-10-05 17:37:16 · 2103 阅读 · 0 评论