数据结构
文章平均质量分 77
TLpigff
这个作者很懒,什么都没留下…
展开
-
哈希表(二)——哈希函数(字符串哈希算法)
在上一篇文章哈希表的大小提到过一种除留余数法的计算哈希值的函数。这一篇文章来具体说一说,怎么设计哈希函数能够让哈希表更加效率。哈希函数,是用来计算存储数据的哈希值的,根据存储数据的类型,可以设计不同的哈希函数。一个好的哈希函数(让哈希表效率高的函数),一般都具备下面两个特点:速度快(别计算一个哈希值计算了半天,导致效率很低,简单高效就好) 能够将得到的哈希值均匀地分布在整个哈希表中,保证...原创 2018-08-30 14:58:29 · 2691 阅读 · 1 评论 -
哈希表(一)——哈希表的大小
哈希表的设计主要是为了查找,为了对内存中的数据进行快速查找,它的查找时间复杂度是O(1)。设计一个哈希表的关键有三个:怎么控制哈希表的长度,怎么设计哈希函数,怎么处理哈希冲突今天这篇文章先来讨论一下如何设计我们的哈希表的大小哈希表的长度一般是定长的,在存储数据之前我们应该知道我们存储的数据规模是多大,应该尽可能地避免频繁地让哈希表扩容。但是如果设计的太大,那么就会浪费空间,因为我们跟不用不...原创 2018-08-30 13:47:27 · 27561 阅读 · 2 评论 -
排序算法(代码及注释)
排序是将一组随机数组排成有序的。关于排序算法,也分有很多种,具体分类如下图: 下面我们来看一下以下这些排序的区别及代码实现,本篇文章的测试用例一律采用升序排序。插入排序直接插入排序 这是最常见的也是最常用的排序方法,也是在数组元素少的时候效率最佳的方法。因为这个方法是在是太常见了,所以一般来说我们平时所说的插入排序,实际就是指直接插入排序。核心思想:从第二个元素开始,将之...原创 2018-01-08 20:35:45 · 529 阅读 · 0 评论 -
堆的实现及应用(优先级队列,堆排,TopK问题)
堆数据结构是一种数组对象,它可以被看做是一棵完全二叉树。 堆的二叉树存储有两种方式: 1.最大堆:每个父节点的值都大于孩子节点 2.最小堆:每个父节点的值都小于小子节点 如上图所示就是一个最小堆。关于堆,其实说到底就是两种算法,一种是向下调整算法,一种是向上调整算法。我们先结合图来分析一下这两种算法。 就拿上图来说,上图是一个小堆,接下来比如说我们要往里插入一个9,那么因为堆的底...原创 2017-10-15 11:03:46 · 1729 阅读 · 0 评论 -
栈和队列基础面试题
学完了stack和queue的基础接口与模拟实现,接下来我们来一下与栈和队列相关的基础面试题。一.实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1) 这里我们就需要用两个栈来实现这个功能,一个是主栈s1,一个是辅栈s2,不论插入什么元素,都要在s1中插,s2存储的类型为pair,s2作为辅栈它只存储比先前元素还要小的元素,如果之前已经出现过原创 2017-10-06 11:14:18 · 282 阅读 · 0 评论 -
快速排序的三种方式以及快排的优化
一.快速排序的基本思想关于快速排序,它的基本思想就是选取一个基准,一趟排序确定两个区间,一个区间全部比基准值小,另一个区间全部比基准值大,接着再选取一个基准值来进行排序,以此类推,最后得到一个有序的数列。二.快速排序的步骤1.选取基准值,通过不同的方式挑选出基准值。2.用分治的思想进行分割,通过该基准值在序列中的位置,将序列分成两个区间,在准值左边的区间里的数都比基准值小(默认以升序排序),在基原创 2018-01-12 17:27:27 · 20119 阅读 · 7 评论 -
浅谈二叉搜索树
二叉搜索树的特点 对于二叉搜索树来说,每一个节点都存有一个关键字(key)用来区分不同的节点,每一个节点的key值各不相同。根据人们的需要,在我们可以同时放进一个value类型,来表示key的关键字所存的内容。这就和字典的功能比较相似,也就是俗称的KV。 1.左子树上所有节点的key值都小于根节点。 2.右子树上所有节点的key值都大于根节点。 从这里可知,二叉搜索树的key值能存放的类型必原创 2017-11-02 10:30:43 · 401 阅读 · 0 评论 -
浅谈平衡搜索树之AVL树
对于上篇的二叉搜索树,我们可以讨论一下它的时间复杂度。在最好的情况下,也就是这颗二叉搜索树是一棵完全二叉树的情况下,它的查找效率是lgN(以2为底N的对数,这里为了方便起见这样写),但是在最坏的情况下,也就是说,在插入的时候是有序插入,这颗二叉搜索树达到了以下的状态 这个时候这颗二叉搜索是一棵极度不平衡的树,它的时间复杂度是N。显然如果这颗树存了10亿个数据,那么最坏的情况要查找10亿次,而对原创 2017-11-05 14:21:02 · 330 阅读 · 0 评论 -
STL库的map和set的使用
之前我们讲到过红黑树这个数据结构,STL库中还有两个非常重要的容器的底层是通过红黑树实现的,那就是map(图)和set(集合)。两者的表示上的区别在于,set存储的只是一个key,而map是以key和value的方式存储的(实际上是存储了一个pair的键值对,后面会讲到)。两者的接口基本类似,为了方便起见,这里就以set为准先来介绍。setset(集合)是按特定顺序存储独特元素的容器。在集合中,元素原创 2017-11-12 14:01:35 · 1791 阅读 · 0 评论 -
浅谈平衡搜索树之红黑树
上篇我们讲到了平衡搜索树的一种AVL树,它的时间复杂度是O(lgN)。这是一种相对来说很严格的平衡搜索树,它的平衡条件相对苛刻,在很多情况下都需要旋转调整,我们可以理解为它更容易发生旋转。今天我们要介绍的是红黑树,相比于AVL树,它更不容易发生旋转。红黑树的特点 1.每个节点,只有红或黑两种颜色。 2.根节点是黑色的。 3.不会有两个连续的红节点出现。 4.对每个节点,从该节点到其所有后代叶原创 2017-11-08 16:20:23 · 252 阅读 · 0 评论 -
STL库中的stack和queue及其模拟实现
在学完了list和vector之后,紧接着就是与其相关联的两个数据结构栈(stack)和队列(queue)。栈的特点是先进后出,即先进栈的元素后出栈;队列的特点是后进先出,即先入队列的元素先出队列。 栈只允许在栈顶插入和删除数据,其基本结构如下 队列只允许在队尾插入数据,在队头删除数据,其基本结构如下 栈更像是一个线性表,因为vector的push_back 和 pop_back更容易原创 2017-10-06 10:12:12 · 512 阅读 · 0 评论 -
关于迷宫求解及其最优解的问题
关于迷宫问题,求解它的最优解的问题可以使用栈的概念来实现。简单的迷宫如下图 其中0表示可以走,1表示不能走,显然可见,若是以(3,1)点为入口,则有两个出口分别是(10,3)和(10, 8)。而两个出口的路径长度是不同的。这就产生了迷宫最优解的问题。 下面附上代码,我们寻找下一个位置是否可走的顺序是顺时针顺序,即上右下左。#pragma once#include<iostream>usi原创 2017-10-08 11:39:53 · 3795 阅读 · 0 评论 -
哈希表(三)——哈希冲突
之前的两篇文章多次提到哈希冲突,这里再解释一下。所谓哈希冲突,就是两个key值经过哈希函数计算以后得到了相同的哈希值,而一个下标只能存放一个key,这就产生了哈希冲突,如果这个下标其中一个key先存着了,那另一个key就必须通过别的方法找到属于自己的存放位置。产生了哈希冲突,我们就要解决。选择一个好的解决哈希冲突的方法,也是提高哈希表效率的关键。开发定址法为产生冲突的地址Hash(...原创 2018-08-30 15:56:09 · 3078 阅读 · 0 评论