数据结构与算法
段渣渣
这个作者很懒,什么都没留下…
展开
-
数据结构之动态数组
版权声明:未经允许,随意转载,请附上本文链接谢谢(づ ̄3 ̄)づ╭❤~ 数据结构之动态数组实现动态数组的关键方法是 resize方法 private void resize(int newCapacity) { E[] newData = (E[]) new Object[newCapacity]; for (int i = 0; i <...原创 2018-07-11 17:34:12 · 370 阅读 · 0 评论 -
选择排序
选择排序基本理解选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,...原创 2018-07-28 22:03:07 · 149 阅读 · 0 评论 -
插入排序
插入排序简单理解插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。算法步骤一般来说,插入...原创 2018-07-28 22:04:11 · 223 阅读 · 0 评论 -
归并排序及其优化
归并排序基本概念归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为 O(n\log n)}(大O符号)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。算法步骤递归法(Top-down) 1. 申请空间,使其大小为两...原创 2018-07-29 23:10:29 · 1688 阅读 · 1 评论 -
快速排序及其优化——随机化标定点、双路快排、三路快排
快速排序及其优化——随机化标定点、双路快排、三路快排快速排序基本概念快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序 n个项目要 O(nlog n)(大O符号)次比较。在最坏状况下则需要 O(n2)O(n2)O(n^{2})次比较,但这种状况并不常见。事实上,快速排序...原创 2018-07-29 23:12:50 · 701 阅读 · 0 评论 -
优先队列与最大堆
优先队列与最大堆什么是优先队列优先队列:出队顺序与入队顺序无关,和优先级有关 普通队列:先进先出,后进后出不同底层结构底层实现优先队列的时间 底层机构 入队 出队(拿出最大元素) 普通线性结构 O(1) O(n) 顺序线性结构 O(n) O(1) 堆 O(logn) O(logn)可以看出普通与顺序的...原创 2018-07-30 21:32:42 · 995 阅读 · 1 评论 -
堆排序及其优化
堆排序堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。排序过程图示 首先,将元素进行重排,以匹配堆的条件。图中排序过程之前简单的绘出了堆树的结构复杂度分析分类 排序算法 数据结构 数组 最坏时间复杂度O(nlogn)O(nl...原创 2018-07-31 12:31:11 · 699 阅读 · 0 评论 -
原地堆排序
原地堆排序基于堆相关的操作,我们可以很容易的定义堆排序。例如,假设我们已经读入一系列数据并创建了一个堆,一个最直观的算法就是反复的调用extractMax函数,因为该函数总是能够返回堆中最大的值,然后把它从堆中删除,从而对这一系列返回值的输出就得到了该序列的降序排列。真正的原地堆排序使用了另外一个小技巧。堆排序的过程创建一个堆H[0...n−1]H[0...n−1]H[0...n...原创 2018-07-31 12:31:45 · 282 阅读 · 0 评论 -
索引堆及其优化
索引堆基本理解最小生成树算法, 还是最短路径算法, 我们都需要使用索引堆进行优化。索引堆解决普通堆的一些局限性 堆中存储的元素结构复杂,交换元素的代价很大堆建成后改变了原本他在数组中的位置,我们如果想要修改某个元素的值,将会很困难,如果添加一个元素表示他原来的位置的话,我们需要遍历一遍堆才能找到进行修改,这样的性能也是低效的对于索引堆来说,我们将数据和索引这两部分分开存储。真正表...原创 2018-07-31 12:32:40 · 343 阅读 · 0 评论 -
简单图的存储和表示
什么是简单图在无向图中,关联一对顶点的无向边如果多于1条,则称这些边为平行边,平行边的条数称为重数。在有向图中,关联一对顶点的有向边如果多于1条,并且这些边的始点与终点相同(也就是它们的的方向相同),称这些边为平行边。含平行边的图称为多重图,既不含平行边也不含环的图称为简单图。稠密图和稀疏图的定义有很少条边或弧(边的条数|E|远小于|V|²)的图称为稀疏图(sparse graph...原创 2018-08-01 18:54:31 · 1271 阅读 · 0 评论 -
无权图的广度优先遍历寻找单源最短路径
图的广度优先遍历寻找最短路径直接看代码package GraphBasics;import java.util.LinkedList;import java.util.Stack;import java.util.Vector;/** * @ Description: 寻找s到w的最短路径 * @ Date: Created in 13:14 2018/8/1 * @...原创 2018-08-01 18:55:49 · 1655 阅读 · 0 评论 -
图的深度优先遍历寻路算法
图的深度优先遍历寻路算法看注释吧package GraphBasics;import java.util.Stack;import java.util.Vector;/** * @ Description:深度优先遍历寻路算法 * @ Date: Created in 12:53 2018/8/1 * @ Author: Anthony_Duan */public ...原创 2018-08-01 18:56:21 · 1055 阅读 · 0 评论 -
求图的连通分量
求图的连通分量什么是连通分量无向图G的一个极大连通子图称为G的一个连通分量(或连通分支)。连通图只有一个连通分量,即其自身;非连通的无向图有多个连通分量。实现代码package GraphBasics;/** * @ Description: 求无全图的联通分量 * @ Date: Created in 12:37 2018/8/1 * @ Author: A...原创 2018-08-01 18:57:30 · 4117 阅读 · 0 评论 -
Dijkstra算法求带权图的单源最短路径
Dijkstra算法求带权图的单源最短路径Dijkstra可以用来求不带负权的带权图 Dijkstra的核心是松弛操作,具体松弛操作是什么,请看代码吧。 使用索引堆优化过的Dijkstra算法的时间复杂度为O(Elog(V))O(Elog(V))O(Elog(V))实现代码package ShortestPath;import java.util.Stack;impo...原创 2018-08-02 15:11:20 · 1161 阅读 · 0 评论 -
使用BellmanFord算法求带负权图的单源最短路径
使用BellmanFord算法求带负权图的单源最短路径BellmanFord算法可以处理带不带负权环的图,及时权为负也可以接受,但是时间复杂度较高贝尔曼-福特算法与迪科斯彻算法类似,都以松弛操作为基础,即估计的最短路径值渐渐地被更加准确的值替代,直至得到最优解。在两个算法中,计算时每个边之间的估计距离值都比真实值大,并且被新找到路径的最小长度替代。 然而,迪科斯彻算法以贪心法选取未被处理的...原创 2018-08-02 15:12:07 · 444 阅读 · 0 评论 -
有权图的表示和存储
有权图的表示和存储带权图的存储于无全图的存储差别在于边上,这里将边作为一个类存储。 Edge类package MinimumSpanTrees;/** * @ Description: 图的边 类 * @ Date: Created in 07:47 2018/8/2 * @ Author: Anthony_Duan */public class Edge<Wei...原创 2018-08-02 15:15:25 · 566 阅读 · 0 评论 -
希尔排序
希尔排序基本概念希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: + 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率 + 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位算法过程(wiki百科)原始的算法实现在最坏的情况下需要进行...原创 2018-07-28 22:02:04 · 135 阅读 · 0 评论 -
冒泡排序
冒泡排序冒泡排序基本概念冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序对 n个项目需要O(n^2)的比较次数,且可以原地排序。尽管这个算法是最简单了解和实现的排序算法之一,但它对于包含大量的元...原创 2018-07-28 21:58:15 · 472 阅读 · 0 评论 -
线段树
线段树首先什么是线段树: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。 线段树经常用于基于区间的统计查询 线段树大概长这个样子 ...原创 2018-07-26 10:07:22 · 349 阅读 · 0 评论 -
AVL树
AVL树什么是AVL树 AVL树是最早的自平衡二叉树。他通过标注节点的高度,计算节点的平衡因子,通过左右旋转保持树结构的平衡。 平衡二叉树:对于任意一个节点,左子树和右子树的高度差不能为超过1。平衡二叉树的高度和节点数量之间的关系也是O(logn)的具体实现(注意看注释)package AVLTree;import SetBasicsAndBSTSet.FileOpera...原创 2018-07-25 15:47:11 · 213 阅读 · 0 评论 -
Trie(字典树,前缀树)
Trie(字典树,前缀树)字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 三个基本性质: + 根节点不包含字符,除根节点外每一个节点都只包含一个字符; + 从根节...原创 2018-07-25 15:48:16 · 273 阅读 · 0 评论 -
二分搜索树的底层实现
二分搜索树的底层实现二分搜索树是一个二叉树,二分搜索树的每个节点都大于其左子树的所有节点,并且小于其右子树的所有节点。因此二分搜索树中的元素必须具有可比较性。另外二分搜索树的每一颗之树也是二分搜索树。二分搜索树的具体实现,包括前中后序遍历与利用队列实现层序遍历,以及用栈实现前序遍历等操作。package BinarySearchTree;import java.util.Li...原创 2018-07-25 15:48:59 · 204 阅读 · 0 评论 -
使用带尾指针的链表实现队列
使用带尾指针的链表实现队列普通链表在头部删除和添加节点是快速的,但是在尾部操作时间复杂度过高。如果要实现队列,则带尾指针的链表可以解决在尾部操作时间复杂度的问题。入队与出队的时间复杂度都为O(1)。具体实现代码package LinkedList.LinkedListQueue;/** * @ Description: 使用链表实现队列 * @ Date: Created...原创 2018-07-25 15:49:48 · 2174 阅读 · 0 评论 -
使用链表实现栈
使用链表实现栈根据链表的性质,对头结点的操作的时间复杂度为O(1),可以很自然的想到链表是作为栈实现的非常好的底层数据结构。因为栈就是对栈顶进行操作的一种抽象数据结构具体实现代码 LinkedList类package LinkedList.LinkedListStack;/** * @ Description:带虚拟节点的链表 * @ Date: Created in ...原创 2018-07-25 15:50:41 · 482 阅读 · 0 评论 -
利用动态数组实现循环队列
利用动态数组实现循环队列循环队列主要是为了解决利用动态数组作为底层实现时出队操作的时间复杂度为O(n)这一问题基于动态数组的循环队列的实现package StacksAndQueues.LoopQueue;/** * @ Description: 循环动态队列的实现 * @ Date: Created in 21:56 11/07/2018 * @ Author: An...原创 2018-07-25 15:51:11 · 464 阅读 · 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 · 414 阅读 · 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 · 272 阅读 · 0 评论 -
带虚拟头结点的链表的实现
带虚拟头结点的链表的实现链表是一种动态的线性数据结构。数据存储在节点内。链表与数组的对比 数组最好用于索引有语意的情况数组的最大优点在于支持随机访问链表不适合用于索引有语义的情况链表最大的特点是动态,但是不支持随机访问带虚拟头结点链表的实现package LinkedList;/** * @ Description: 带虚拟节点的链表 * @ Date: Cre...原创 2018-07-25 15:52:30 · 801 阅读 · 0 评论 -
并查集
并查集什么是并查集 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。这是一种很不一样的树的结构,他是子节点指向父节点的结构。 并查集算法不支持分割一个集合。 并查集一般只支持两个操作Union 和isConnected 也就是并和查 并查集的优化常用的有两种,基于rank的优化和路径压缩优化(具体实现都在代码中)具体代码实现...原创 2018-07-25 15:52:54 · 169 阅读 · 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 · 432 阅读 · 0 评论 -
Trie(字典树,前缀树)
Trie(字典树,前缀树)字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 三个基本性质: + 根节点不包含字符,除根节点外每一个节点都只包含一个字符; + 从根节...原创 2018-07-26 10:04:54 · 151 阅读 · 0 评论 -
哈希表
哈希表什么是哈希表 哈希表,又叫散列表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希冲突的常用解决方法 链地址法(拉链法) 开放寻址法 再哈希法具体实现代码(具体的细节问题看注释)package HashTable;im...原创 2018-07-26 10:05:33 · 242 阅读 · 0 评论 -
基于二分搜索树的集合的实现
基于二分搜索树的集合的实现集合是一种存放不同元素的抽象数据结构,底层可以用不同的方式实现,但是不同的方式会有不同的性能。比如用二分搜索树会比链表快很多,用红黑树又会比链表快很多。实现思路二分搜索树实现集合的具体思路 首先实现二分搜索树类,然后实现集合的接口。 二分搜索树类package SetBasicsAndBSTSet;import java.util....原创 2018-07-26 10:06:05 · 212 阅读 · 0 评论 -
红黑树
红黑树大名鼎鼎的红黑树 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。 它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里...原创 2018-07-26 10:06:55 · 159 阅读 · 0 评论 -
求的带权图最小生成树的Prim算法和Kruskal算法
求的带权图最小生成树的Prim算法和Kruskal算法最小生成树的概念最小生成树其实是最小权重生成树的简称。一个连通图可能有多个生成树。当图中的边具有权值时,总会有一个生成树的边的权值之和小于或者等于其它生成树的边的权值之和。广义上而言,对于非连通无向图来说,它的每一连通分量同样有最小生成树,它们的并被称为最小生成森林。以有线电视电缆的架设为例,若只能沿着街道布线,则以街道为边...原创 2018-08-02 15:16:08 · 6339 阅读 · 0 评论