数据结构与算法
HHozi
本博客主要是用来记录自己学习上的总结,以便日后复习。很多文章都是从别的博客文章直接摘抄复制,望见谅。
展开
-
复杂度分析
复杂度分析假设每行代码执行的时间都一样,为 unit_time。复杂度的概念来说,它表示的是一个算法执行效率与数据规模增长的变化趋势。所有代码的执行时间 T(n) 与每行代码的执行次数 n 成正比T(n)代表代码执行的时间,n表示数据规模的大小,f(n)表示每行代码执行的次数总和。公式中的 O,表示代码的执行时间 T(n) 与 f(n)表达式成正比。大O的时间复杂度表示法。大O时间复...转载 2019-03-08 23:50:25 · 108 阅读 · 0 评论 -
逆波兰表达式
原文:https://blog.csdn.net/linraise/article/details/20459751算法:中缀表达式转换成后缀表达式输入:中缀表达式串输出:后缀表达式串PROCESS BEGIN:1.从左往右扫描中缀表达式串s,对于每一个操作数或操作符,执行以下操作; 2.IF (扫描到的s[i]是操作数DATA)将s[i]添加到输出串中; ...转载 2019-05-31 16:57:59 · 188 阅读 · 0 评论 -
字符串搜索算法:BF算法 RK算法 BM算法 KMP算法 Trie树 AC自动机
BF算法(字符串搜素算法)暴力匹配算法主串长度n,模式串长度m。时间复杂度是O(n*m)RK算法(字符串搜素算法)通过哈希算法对主串中的n-m+1个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了(这里先不考虑哈希冲突的问题,后面我们会讲到)。因为哈希值是一个数字,数字之间比较是否相等是非常快速的,所以模式串和子串比...转载 2019-04-05 16:32:56 · 687 阅读 · 0 评论 -
二叉树
满二叉树:除了叶子节点之外,每个节点都有左右两个子节点。完全二叉树:叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大。链式存储法顺序存储法若该节点位置为i,则左子树位置为(2i),右子树位置(2i+1),父节点为(i/2)向下取整。非完全二叉树的存储会浪费空间前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子...转载 2019-03-24 12:03:50 · 329 阅读 · 0 评论 -
堆
堆:完全二叉树排序时间复杂度是O(nlogn)原地排序每个节点的值都大于等于子树中每个节点值的堆,我们叫作“大顶堆”。每个节点的值都小于等于子树中每个节点值的堆,我们叫作“小顶堆”。插入堆化的时间复杂度跟树的高度成正比时间复杂度是 O(logn)把新插入的数据放到数组的最后,然后从下往上堆化//堆public class Heap { private int[] a;/...转载 2019-03-30 11:46:49 · 119 阅读 · 0 评论 -
散列 哈希
散列表用的就是数组支持按照下标随机访问的时候,时间复杂度是 O(1) 的特性。我们通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。当我们按照键值查询元素时,我们用同样的散列函数,将键值转化数组下标,从对应的数组下标的位置取数据。散列函数,顾名思义,它是一个函数。我们可以把它定义成hash(key),其中 key 表示元素的键值,hash(key)的值表示经过散列函数计...转载 2019-03-23 11:13:39 · 273 阅读 · 0 评论 -
图 位图 BFS DFS 拓扑排序 Dijkstra A*
涉及到权重的图,被称为带权图。邻接矩阵(浪费空间)拥有n个顶点的图,它所包含的连接数量最多是n(n-1)个。无向有向邻接表(像散列+链表)图的每一个顶点都是一个链表的头节点,其后连接着该顶点能够直接达到的相邻顶点。但是要查找那个顶点可以到达该顶点,就需要遍历每一个头结点了。逆邻接表和邻接表是正好相反的。逆邻接表每一个顶点作为链表的头节点,后继节点所存储的是能够直接达到该顶点的...转载 2019-03-25 21:46:05 · 281 阅读 · 0 评论 -
二分查找 跳表 LRU缓存 贪心算法 霍夫曼编码 分治算法 回溯算法 动态规划
二分查找:只能是有序的数组,而且应该用在插入删除不频繁的场景中。 public static int commonBinarySearch(int[] arr,int key){ int low = 0; int high = arr.length - 1; if(key < arr[low] || key > arr[high...转载 2019-03-14 22:31:11 · 433 阅读 · 0 评论 -
递归
用栈的数据结构,加上一个简单的逻辑算法实现了业务功能。递归需要满足的三个条件一个问题的解可以分解为几个子问题的解这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样存在递归终止条件写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。例子:假如这里有 n 个台阶,每次你可以跨 1 个台阶...转载 2019-03-10 14:25:16 · 93 阅读 · 0 评论 -
队列
先进者先出,这就是典型的“队列”。最基本的操作是:入队和出队。操作受限的线性表数据结构。顺序队列:public class ArrayQueue { private String[] items; private int n = 0; private int head=0; private int tail = 0; public ArrayQu...转载 2019-03-10 12:44:00 · 87 阅读 · 0 评论 -
B树、B+树、B*树
典型的二叉查找树结构,查找的时间复杂度 O(log2-N) 与树的深度相关。B树是为了磁盘或其它存储设备而设计的一种多叉平衡查找树。B-tree的特点B-tree是一种多路搜索树(并不是二叉的),对于一棵M阶树:定义任意非叶子结点最多只有M个孩子;且M>2;根结点的孩子数为[2, M],除非根结点为叶子节点;除根结点以外的非叶子结点的儿子数为[M/2, M];非叶子结点的关键字...转载 2019-03-10 11:28:18 · 145 阅读 · 0 评论 -
红黑树
红黑树特点:每个节点非红即黑;根节点总是黑色的;每个叶子节点都是黑色的空节点(NIL节点);如果节点是红色的,则它的子节点必须是黑色的(反之不一定);从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)TreeMap、TreeSet以及JDK1.8之后的HashMap底层都用到了红黑树。...转载 2019-03-14 14:17:43 · 130 阅读 · 0 评论 -
栈
后进者先出,先进者后出,这就是典型的“栈”结构。当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。实际上,栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。数组栈public class ArrayStack { private String[] items; //数组...转载 2019-03-10 09:41:45 · 2338 阅读 · 0 评论 -
链表
数组需要一块连续的内存空间来存储,对内存的要求比较高。当内存中没有连续的,足够大的存储空间时,即便内存的剩余总可用空间大于需要的空间,仍然会申请失败。而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针"将一组零散的内存块串联起来使用。单链表其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。我们把这个记录下...转载 2019-03-09 12:13:40 · 143 阅读 · 0 评论 -
数组
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。内存块的首地址为 base_address = 1000a[i]_address = base_address + i * data_type_size数组查找的时间复杂度并不是1,即便是排好序的数组,如果用二分查找,时间复杂度也是O(logn),所以正确的表述应该是,数组支持随机访问,根据下表...转载 2019-03-09 10:41:47 · 108 阅读 · 0 评论 -
排序算法
1、 冒泡排序比较相邻的元素。如果第一个比第二个大,就交换它们两个;对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;针对所有的元素重复以上的步骤,除了最后一个;重复步骤1~3,直到排序完成。2、 选择排序初始状态:无序区为R[1…n],有序区为空;第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R...转载 2019-03-09 00:12:50 · 82 阅读 · 0 评论 -
字符串算法
/**循环左移字符串比如abcdef,左移2位cdefab*/public class Loop_Left_Shift_String {public static void main(String[] args) {Loop_Left_Shift_String l = new Loop_Left_Shift_String();System.out.println(l.L...原创 2019-05-31 20:31:12 · 106 阅读 · 0 评论