
数据结构
Seven17000
与其临渊羡鱼,不如退而结网。
展开
-
二叉搜索树的C++实现
简介二叉搜索树(BST)是满足以下几个性质的二叉树: 1.它的每个结点都有一个关键值(key),且每个结点的key各不相同; 2.若左子树不为空,则左子树上所有结点的key均小于它的根结点的key; 3.若右子树不为空,则右子树上所有结点的key均大于它的根结点的key; 4.左右子树也都为二叉搜索数; 5.空树也是二叉搜索树。如图 BST结点的定义二叉搜索树(BST)也是一颗二叉树,拥原创 2017-03-02 09:51:49 · 512 阅读 · 0 评论 -
使用哈希表解决几个常见算法题
简介哈希表是一种非常常见的KV型的数据结构,他的搜索效率十分高,时间复杂度通常都在O(N)。在C++11之后,引入了容器 unordered_map,它的底层实现就是哈希表,所以我们在需要使用哈希表的时候通常就利用unordered_map。问题1.复杂链表的复制;2.两数和问题;3.计算最多有几个点在同一直线上;一.复杂链表的复制问题分析:复杂链表即链表结点结构中除了数据域data和next指针之原创 2017-06-04 15:43:40 · 6725 阅读 · 0 评论 -
c语言实现链表及其基本操作
链表: 链表是一种物理储存单元上非连续、非顺序的储存结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。和顺序表的区别:顺序表使用数组存储线形的元素,其特点是可以随机存取,但是,因为逻辑上相邻的元素物理上原创 2016-09-13 18:18:10 · 24466 阅读 · 4 评论 -
详细说明优先级队列的使用方法
简介优先级队列是一种常见的数据结构,在《STL源码剖析》中给出的定义是:priorty_queue是以个带权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能。由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素。 但是优先级队列中的元素并非依照被推入队列的顺序排列。而是自动依照元素的权值排列。权值最高者排在最前面。 缺省的情况下维护的是一个大堆,即权值以从高到低排原创 2017-04-24 23:00:11 · 4393 阅读 · 0 评论 -
实现带最小值操作的栈
简介栈的结构特性是后入先出,一般栈给出了基本操作接口有: empty:栈空返回真; pop:移除栈顶元素; push:在栈顶增加元素; size:返回栈中元素数目; top:返回栈顶元素。 今天我们要实现一个新的栈,在这些普通栈的操作上增加一个新的操作min,那就是返回栈中的最小元素。设计思路在新设计的栈中使用两个库中给出的栈,一个按照正常的压栈顺序向栈中存入数据,另一个栈只在存入的数据原创 2017-05-14 15:52:56 · 728 阅读 · 0 评论 -
哈希表的C++实现(线性探测)
简介哈希表/散列表(HashTable)是一种根据关键字(key)直接进行访问数据存储位置的数据结构。他通过一个关键字的函数把数据映射到表中的储存位置,这个映射函数叫做散列函数或者哈希函数,存放数据的数组就叫做散列表,即哈希表。哈希表的应用哈希表经常被用于信息安全方面,因为哈希表可以把数据和存放地址映射起来,从而实现加密。或者说他是把一些不同长度的信息转化成杂乱的编码,这些编码叫做哈希值。 哈希表原创 2017-03-14 12:31:26 · 10063 阅读 · 1 评论 -
哈希桶的实现(拉链法)
简介为了解决线性探测实现哈希表时出现哈希冲突后导致数据堆聚的现象,我们采取了另一种结构来处理哈希冲突,哈希桶(拉链法),拉链法解决冲突的做法是将所有通过哈希函数计算出来的哈希地址相同的结点存放在一个单链表之中。 实现原理就是将哈希表定义为一个由N个头指针组成的指针数组,经过哈希函数计算得到的哈希地址相同的数据全部连在对于的头指针下面。它继承了数组的易于查找和链表便于删除插入的特点。时间复杂度拉链法原创 2017-03-16 11:10:54 · 4996 阅读 · 0 评论 -
并查集解决朋友圈问题
引入最近在网上看到了这样一道面试题: 假如已知有n个人和m对好友关系(存于数组r)如果两个人是直接或间接的好友(好友的好友的好友…),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。假如:n = 5,m = 3,r = {{1 , 2} , {2 , 3} , {4 , 5}}表示有5个人,1和2是好友,2和3是好友4和5是好友,则1、2、3属于一个朋友圈4、5属于另一个朋友原创 2017-03-30 15:21:42 · 2469 阅读 · 0 评论 -
BitMap(位图)结构的C++实现
简介位图是一种非常常见的结构,它使用每个二进制位来存放一个值的状态,正因为这个性质,它经常被用在数据压缩或者是索引等方面。有这样一道题:给40亿个不重复的无符号整数,没有经过排序,然后再给一个树,如何快速判断这个数是否在40亿个数之中?在这里如果我们实打实的存放40亿个数据在内存中,那会占据将近15个G的内存,普通电脑根本无法满足,更不用说在对其进行查找操作了。 那么如果选择位图来存储的话我们只需原创 2017-03-12 19:44:58 · 2418 阅读 · 0 评论 -
B树的C++实现
简介和AVL树、RB树一样,B树也是一种搜索树结构,能够存储数据也可以对其进行排序。它的特点是结点可以有多余两个的子结点。但是他的优势在于处理大块数据的读写操作,因为在计算机中的存储体系当中,有一种叫做局部性的东西。他分为时间局部性和空间局部性。时间局部性:最近被访问的内存内容会很快再被访问; 空间局部性:靠近当前被访问内存的内存内容很快也会被访问。当在处理大块数据操作的时候B树的特性就可以减少定原创 2017-03-11 22:58:23 · 1137 阅读 · 0 评论 -
红黑树C++实现以及与AVL树的区别
简介红黑树也是二叉搜索树的一种,所以它也满足二叉搜索树的各类性质。但是红黑树还要同时满足下面几种规则。在STL深度剖析中给出了四个规则:1.结点不是红色就是黑色; 2.根结点是黑色; 3.如果结点是红色的,那么它的两个孩子要为黑色; 4.任一结点到NULL结点即尾结点的任何路径,经过黑色结点的个数相同。其实满足这些性质之后还是可能产生不平衡的状态即两棵子树的高度差在1以上,但是可以确保没有一条原创 2017-03-07 20:14:34 · 1175 阅读 · 0 评论 -
AVL树的C++实现
简介AVL树本质上是一颗二叉搜索树,但是它和普通的二叉搜索树不同的是它的每一个结点的两个子树的高度差不超过一,所以AVL树也叫做平衡二叉树,如果删除或者插入一个结点使其高度差变化,就要对其进行旋转再使它平衡。这样就解决了二叉搜索树链表化后(类似下图第三种情况)中各类操作中的时间复杂度的提高的状况。结构定义和普通的二叉搜索树一样,AVL树的结点中包含左右孩子结点,key值与value值,不同的是AVL原创 2017-03-04 22:15:14 · 684 阅读 · 0 评论 -
二叉搜索树,AVL,红黑树,B树,哈希表,位图的比较
简介二叉搜索树定义: 1.是一颗空树或者是具有以下性质的二叉树; 2.若左子树不为空那么左子树上的值都小于根结点的值; 3.若右子树不为空那么右子树上的值都大于根结点的值; 4.左右子树都为二叉搜索树。AVL树定义: 1.是一颗空树或者具有以下性质的二叉搜索树; 2.每个结点左右孩子的高度差的绝对值不超过1。红黑树定义: 1.树的结点有两种颜色,不是红色就是黑色; 2.根结点为黑色;原创 2017-03-17 10:46:17 · 1064 阅读 · 0 评论 -
c语言顺序表的实现与基本操作
顺序表定义:如图所示顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。 顺序表的特性:1.长度固定;2.存储空间是连续的;3.要在顺序表中插入或删除一个元素的时候会牵动其后的所有元素,所以时间复杂度是O(n)结构体实现#define MAX_SIZE 10typedef原创 2016-09-09 00:04:00 · 1388 阅读 · 0 评论 -
c语言顺序表动态实现
动态版与静态版区别:当插入数据时内存空间不够时,动态版的顺序表可以再重新开辟一块更大的空间用来存放数据。顺序表的优缺点:顺序表的优点是便于随机存储,缺点是不便于插入删除等操作,因为插入删除一个元素需要移动其后的所有元素。结构体实现typedef int DataType;typedef struct SeqListD{ DataType* array; int capacity原创 2016-09-11 13:33:16 · 530 阅读 · 0 评论 -
如何获取一定范围内不重复的随机数
简介生成一个随机数是很多时候需要实现的,往往会采用时间种子的方式,如下所示。#include <iostream>using namespace std;int main(){ int i = rand(); printf("%d", i); return 0;}这种直接使用rand函数去获取随机数的方式由于使用了默认的随机种子,所以获得的...原创 2018-08-06 10:54:41 · 2945 阅读 · 0 评论