数据结构与算法
一些数据结构的底层实现
段渣渣
这个作者很懒,什么都没留下…
展开
-
希尔排序
希尔排序基本概念希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: + 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率 + 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位算法过程(wiki百科)原始的算法实现在最坏的情况下需要进行...原创 2018-07-28 22:02:04 · 125 阅读 · 0 评论 -
选择排序
选择排序基本理解选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,...原创 2018-07-28 22:03:07 · 137 阅读 · 0 评论 -
插入排序
插入排序简单理解插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。算法步骤一般来说,插入...原创 2018-07-28 22:04:11 · 211 阅读 · 0 评论 -
冒泡排序
冒泡排序冒泡排序基本概念冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序对 n个项目需要O(n^2)的比较次数,且可以原地排序。尽管这个算法是最简单了解和实现的排序算法之一,但它对于包含大量的元...原创 2018-07-28 21:58:15 · 457 阅读 · 0 评论 -
用动态数组实现栈
用动态数组实现栈栈的定义 栈是一种后进先出的数据结构Last in first out(LIFO)栈的定义 栈应该至少实现以下接口package StacksAndQueues.ArrayStack;/** * @ Description: Stack接口 标准的栈应该具有以下5个对外方法 * @ Date: Created in 19:00 11/07/2018 ...原创 2018-07-26 10:01:41 · 418 阅读 · 0 评论 -
Trie(字典树,前缀树)
Trie(字典树,前缀树)字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 三个基本性质: + 根节点不包含字符,除根节点外每一个节点都只包含一个字符; + 从根节...原创 2018-07-26 10:04:54 · 142 阅读 · 0 评论 -
哈希表
哈希表什么是哈希表 哈希表,又叫散列表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希冲突的常用解决方法 链地址法(拉链法) 开放寻址法 再哈希法具体实现代码(具体的细节问题看注释)package HashTable;im...原创 2018-07-26 10:05:33 · 233 阅读 · 0 评论 -
基于二分搜索树的集合的实现
基于二分搜索树的集合的实现集合是一种存放不同元素的抽象数据结构,底层可以用不同的方式实现,但是不同的方式会有不同的性能。比如用二分搜索树会比链表快很多,用红黑树又会比链表快很多。实现思路二分搜索树实现集合的具体思路 首先实现二分搜索树类,然后实现集合的接口。 二分搜索树类package SetBasicsAndBSTSet;import java.util....原创 2018-07-26 10:06:05 · 197 阅读 · 0 评论 -
红黑树
红黑树大名鼎鼎的红黑树 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。 它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里...原创 2018-07-26 10:06:55 · 145 阅读 · 0 评论 -
线段树
线段树首先什么是线段树: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。 线段树经常用于基于区间的统计查询 线段树大概长这个样子 ...原创 2018-07-26 10:07:22 · 340 阅读 · 0 评论 -
数据结构之动态数组
版权声明:未经允许,随意转载,请附上本文链接谢谢(づ ̄3 ̄)づ╭❤~ 数据结构之动态数组实现动态数组的关键方法是 resize方法 private void resize(int newCapacity) { E[] newData = (E[]) new Object[newCapacity]; for (int i = 0; i <...原创 2018-07-11 17:34:12 · 357 阅读 · 0 评论 -
AVL树
AVL树什么是AVL树 AVL树是最早的自平衡二叉树。他通过标注节点的高度,计算节点的平衡因子,通过左右旋转保持树结构的平衡。 平衡二叉树:对于任意一个节点,左子树和右子树的高度差不能为超过1。平衡二叉树的高度和节点数量之间的关系也是O(logn)的具体实现(注意看注释)package AVLTree;import SetBasicsAndBSTSet.FileOpera...原创 2018-07-25 15:47:11 · 203 阅读 · 0 评论 -
Trie(字典树,前缀树)
Trie(字典树,前缀树)字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 三个基本性质: + 根节点不包含字符,除根节点外每一个节点都只包含一个字符; + 从根节...原创 2018-07-25 15:48:16 · 263 阅读 · 0 评论 -
二分搜索树的底层实现
二分搜索树的底层实现二分搜索树是一个二叉树,二分搜索树的每个节点都大于其左子树的所有节点,并且小于其右子树的所有节点。因此二分搜索树中的元素必须具有可比较性。另外二分搜索树的每一颗之树也是二分搜索树。二分搜索树的具体实现,包括前中后序遍历与利用队列实现层序遍历,以及用栈实现前序遍历等操作。package BinarySearchTree;import java.util.Li...原创 2018-07-25 15:48:59 · 194 阅读 · 0 评论 -
使用带尾指针的链表实现队列
使用带尾指针的链表实现队列普通链表在头部删除和添加节点是快速的,但是在尾部操作时间复杂度过高。如果要实现队列,则带尾指针的链表可以解决在尾部操作时间复杂度的问题。入队与出队的时间复杂度都为O(1)。具体实现代码package LinkedList.LinkedListQueue;/** * @ Description: 使用链表实现队列 * @ Date: Created...原创 2018-07-25 15:49:48 · 2155 阅读 · 0 评论 -
使用链表实现栈
使用链表实现栈根据链表的性质,对头结点的操作的时间复杂度为O(1),可以很自然的想到链表是作为栈实现的非常好的底层数据结构。因为栈就是对栈顶进行操作的一种抽象数据结构具体实现代码 LinkedList类package LinkedList.LinkedListStack;/** * @ Description:带虚拟节点的链表 * @ Date: Created in ...原创 2018-07-25 15:50:41 · 460 阅读 · 0 评论 -
利用动态数组实现循环队列
利用动态数组实现循环队列循环队列主要是为了解决利用动态数组作为底层实现时出队操作的时间复杂度为O(n)这一问题基于动态数组的循环队列的实现package StacksAndQueues.LoopQueue;/** * @ Description: 循环动态队列的实现 * @ Date: Created in 21:56 11/07/2018 * @ Author: An...原创 2018-07-25 15:51:11 · 448 阅读 · 0 评论 -
利用动态数组实现队列
利用动态数组实现队列队列是一种先进先出的数据结构First in First out(FIFO)队列的至少应该实现以下接口package StacksAndQueues.ArrayQueue;/** * @ Description: Queue接口 * @ Date: Created in 20:49 11/07/2018 * @ Author: Anthony_Dua...原创 2018-07-25 15:51:39 · 397 阅读 · 0 评论 -
基于链表的映射的实现
基于链表的映射的实现映射接口package SetBasicsAndBSTSet;/** * @ Description: 映射接口 * @ Date: Created in 21:54 20/07/2018 * @ Author: Anthony_Duan */public interface Map<K, V> { void add(K key, ...原创 2018-07-25 15:52:07 · 262 阅读 · 0 评论 -
带虚拟头结点的链表的实现
带虚拟头结点的链表的实现链表是一种动态的线性数据结构。数据存储在节点内。链表与数组的对比 数组最好用于索引有语意的情况数组的最大优点在于支持随机访问链表不适合用于索引有语义的情况链表最大的特点是动态,但是不支持随机访问带虚拟头结点链表的实现package LinkedList;/** * @ Description: 带虚拟节点的链表 * @ Date: Cre...原创 2018-07-25 15:52:30 · 784 阅读 · 0 评论 -
并查集
并查集什么是并查集 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。这是一种很不一样的树的结构,他是子节点指向父节点的结构。 并查集算法不支持分割一个集合。 并查集一般只支持两个操作Union 和isConnected 也就是并和查 并查集的优化常用的有两种,基于rank的优化和路径压缩优化(具体实现都在代码中)具体代码实现...原创 2018-07-25 15:52:54 · 157 阅读 · 0 评论