数据结构与算法
chsmy2018
学无止境,任何技能都是慢慢积累出来的。
展开
-
快速排序
快速排序效率高,空间复杂度底,在工作中一般是用的最多的排序算法,所以需要掌握。在看快速排序之前,先看一下另一个比快排简单点的问题,就是荷兰国旗问题给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)解决思路:准备准备三个指针less、more、curles...原创 2019-10-20 22:08:35 · 143 阅读 · 0 评论 -
动态规划
本文是数据结构与算法之美的学习笔记动态规划比较适合用来求解最优问题,比如求最大值、最小值等等。它可以非常显著的降低时间复杂度,提高代码的执行效率。动态规划的核心思想就是记住已经解决过的子问题,不去重复计算0-1背包问题对于一组重量不同且不可分割的物品,选择一些放入背包中,在不超过背包所能承受的最大重量前提下,怎么让背包中的总重量最大。这种问题可以使用回溯算法解决代码如下// 回溯算法实...原创 2019-03-20 15:22:00 · 294 阅读 · 0 评论 -
贪心算法和分治算法
本文是数据结构与算法之美的学习笔记贪心算法的概念贪心算法是指在解决问题的时候,总是选择当前最好的,并希望通过一系列的最优选择,能够产生一个问题的全局最优解。比如我们有一个可以容纳100kg物品的背包,我们有5种豆子吗,每种豆子的总量和总价值都不一样,如何能让背包中的物品总价值最大呢?豆子总量(kg)总价值(元)黄豆100100绿豆3090红豆60...原创 2019-03-04 10:28:19 · 3284 阅读 · 0 评论 -
字符串匹配算法(多模式串)
本文是数据结构与算法之美的学习笔记上一篇了解了单模式串匹配算法,现在来学习多模式串匹配算法,首先需要了解Trie树Trie树的概念Trie树也叫字典树或者前缀树,它是一个树形的结构。是一种专门用来处理字符串匹配的数据结构,用来解决在一组字符串中快速查找某个字符串的问题。谷歌,百度这种搜索引擎,输入框的关键词提示功能,底层原理就是使用了这种数据结构Tire树是一种有序树,用于保存关联数组,...原创 2019-02-23 22:35:40 · 6077 阅读 · 1 评论 -
数据结构之红黑树
此文是数据结构与算法之美学习笔记二叉查找树在频繁的动态更新的过程中,可能会出现树的高度很大的情况,从而导致各个操作的效率下降,极端情况下,二叉树会退化为链表,为了解决这种复杂度退化的问题,需要设计一个平衡的二叉查找树。平衡二叉查找树平衡二叉查找树的定义是,二叉树中的任意一个节点的左右子树的高度相差不能大于1。完全二叉树和满二叉树都是平衡二叉树的一种。平衡的意思就是让树的左右看起来比较对称,...原创 2019-02-11 20:26:14 · 782 阅读 · 0 评论 -
数据结构之二叉树
本文是数据结构和算法之美学习笔记树树这种数据结构跟现实中的树很像,里面的每个元素叫做结点,用连线把相邻的结点连接起来,相邻结点之间的关系叫父子关系。比如下图中,A结点是B的父节点,B是A的子结点,B,C,D是兄弟结点,E没有父节点称为根节点,没有子节点的结点是叶子结点,G,H,I,H,K,L都是叶子结点。树一般用三个概念可以描述,高度,深度,层高度:结点到叶子结点的最长路径(边数)深...原创 2019-02-11 20:23:57 · 237 阅读 · 0 评论 -
字符串匹配算法(单模式串)
本文是数据结构与算法之美的学习笔记字符串的匹配我们在平时工作中经常用到,每个语言中都有其对应的字符串的匹配方法,比如Java中的indexOf(),Python中的find()等他们底层都依赖了各种字符串的匹配算法。字符串的匹配算法有:单模式串匹配算法(BF算法,RK算法,BM算法,KMP算法),多模式串匹配算法(Trie树,AC自动机)BF(Brute Force)算法基础概念:如果我...原创 2019-02-17 22:37:22 · 4329 阅读 · 1 评论 -
数据结构之堆
此文是数据结构与算法之美的学习笔记堆的概念堆是一种特殊的数,应用场景很多,最经典的就是堆排序,堆排序是一种原地排序,时间复杂度是O(nlogn)堆的特点堆是一个完全二叉树(除了最后一层,其他层的节点的个数都是满的,最后一层的节点都是靠左排列)堆中的每个节点的值都必须大于等于或者小于等于其子树中的每个节点的值每个节点的值都大于等于子树中每个节点的值的堆叫做“大顶堆”,每个节点的值都小...原创 2019-01-30 15:37:20 · 158 阅读 · 0 评论 -
数据结构之图
本文是数据结构与算法之美的学习笔记图的概念图跟树一样也是一种非线性的数据结构,比树更加复杂一点。树种的元素叫做结点,图中的每个元素叫做顶点,图中的每一个元素都可以与其他的顶点建立连接关系,这种关系叫做边。比如微信,每个用户就可以叫做一个顶点,两个好友之间的通道就是边,每个用户的好友数量就叫做顶点的度,度表示一个顶点有几条边。微博跟微信不一样,微博可以单向关注,A关注B,B可以不关注A,...原创 2019-02-14 20:50:59 · 240 阅读 · 1 评论 -
数据结构之哈希算法
此文是数据结构和算法之美学习笔记哈希算法就是将任意长度的二进制值映射为固定长度的二进制串,这个映射的规则就是哈希算法,原始数据映射之后得到的二进制哈希值。一般哈希算法的要求:不能通过哈希值反向推导出原始数据(哈希算法也叫单向哈希算法)对输入的数据非常敏感,哪怕原始数据只是修改了一个bit,最后得到的哈希值也大不形同对不同的原始数据,哈希值相同的概率要非常小,散列冲突的概率要很小。哈希...原创 2019-01-22 13:53:11 · 4811 阅读 · 0 评论 -
数据结构之散列表
此文是数据结构与算法之美学习笔记散列表英文名叫“Hash Table”,也叫哈希表或者Hash表。它利用数组支持按照下标随机访问的特性,所以散列表其实是数组的一种扩展,由数组演化而来。通过散列函数,吧元素的键值映射为下标,然后把数据存储到数组中对应下标的位置。当我们按照键值查询元素的时候,使用同样的散列函数,将键值转化为数组的下标,然后向对应的下标位置去取数据。文中有个例子很好,比如有89名...原创 2019-01-22 13:50:09 · 4666 阅读 · 0 评论 -
数据结构之排序
本篇是数据结构与算法之美学习笔记排序在在平时的开发中会经常用到,排序的算法也有很多,冒泡排序、插入排序、选择排序、归并排序,开旭排序、计数排序、基数排序、桶排序等。如何分析一个排序算法1.排序算法的执行效率(1)最好情况、最坏情况、平均情况时间复杂度为什么要区分三种时间复杂度呢?第一有些排序算法会区分,为了更好的对比,最好都做一下区分。第二,对于要排序的数据,有的接近有序,有的完全无序,...原创 2019-01-16 15:57:28 · 329 阅读 · 0 评论 -
数据结构之跳表
本篇是数据结构与算法之美学习笔记上一篇据结构之二分查找中我们知道二分查找底层依赖的是数组随机访问的特性,所以只能使用数组实现,不能再链表中实现。那链表可不可以支持类似的二分查找呢?答案当然可是可以,就是给链表加上索引,这种数据结构称为跳表。对于一个单链表来说,即使它存储的数据是有序的,如果我们要在其中查找某个数据,也只能从头到尾的遍历建表,这样的查找效率很低。那怎么优化呢,可以对链表建立索...原创 2019-01-16 11:13:41 · 804 阅读 · 0 评论 -
数据结构之二分查找
本文是数据结构和算法之美的学习笔记二分查找是一种非常简单易懂的快速查找算法,生活中到处可见。比如有一个0-99之间的数组,随便取一个数,每猜一次都告诉你大了还似乎小了直到猜中为止。比如这个数是33第一次 0-99 中间数是49 49>33第二次 0-48 中间数是24 24<33第三次 25-48 中间数是36 36>33第四次 25-35 中间数是30 30<3...原创 2019-01-14 15:57:29 · 2905 阅读 · 0 评论 -
数据结构之递归
本篇是数据结构与算法之美学习笔记递归在计算机科学中指一种通过将重复问题分解为同列子问题来解决问题的方法。递归是一种常见的算法或者编程技巧。很多数据结构和算法的编码实现都会使用到递归,比附DFS深度搜索,前中后序二叉树遍历等等。递归需要满足三个条件1.一个问题的解可以分成几个解。子问题就是数据规模更小的的问题2.这个问题和分解之后的子问题,除了数据规模不同,解决思路是一样的。3.存在递...原创 2019-01-08 15:51:41 · 2615 阅读 · 1 评论 -
数据结构之队列
数据结构之队列本篇是数据结构与算法之美学习笔记队列是一种可以实现“先进先出”的存储结构。就排队办理业务,先到的人先办理,不能插队。CUP的资源是有限的,任务的处理速度与线程的个数并不是线性正相关的。相反,过多的线程反而会导致CPU频繁切换,处理能力下降,所以线程池的大小一般都是综合考虑要处理任务的特点和硬件环境来预先设置的。当我们向一个固定大小的线程池中请求一个线程的时候,如果线程池中没...原创 2019-01-08 09:48:06 · 227 阅读 · 0 评论 -
数据结构之栈
本篇是数据结构与算法之美学习笔记栈是一种特殊的线性表,仅能在线性表的一端操作数据,只允许在栈顶操作,特性:后进先出。就像我们往一个盒子里放东西,最先放的东西总是在下面,往外拿的时候,先拿到最后放进去的。当某个数据集合,只涉及在一端插入和删除数据,并且满足后进先出的特性,这时候首选栈这种数据结构。从上面的定义可以看出,栈主要包括两个操作,入栈和出栈,也就是从栈顶插入一个数据,和从栈顶删除一...原创 2019-01-07 17:54:39 · 175 阅读 · 0 评论 -
数据结构之链表
链表和数组一样,都是编程语言中经常用到的数据结构。相比数组,链表是一种稍微复杂一点的数据结构,我们可以两者对比着来看数组需要一块连续的内存空间来存储数据,对内存的要求比较高,如果我们申请一个100MB大小的数组,如果内存中没有一个连续的100MB的空间,即使内存中剩余的空间大小大于100MB,也会申请失败链表就不一样了,它不需要一块连续的内存空间,它是通过‘指针’把一组零散的内存块串联起来所...原创 2019-01-06 19:47:19 · 644 阅读 · 2 评论 -
数据结构之数组
每一种编程语言中基本都有数组。数组的定义:数组(array)是一种线性表数据结构,它用一组连续的内存空间来存储一组具有相同类型的数据。从上面的定义中有几个关键词首先它是一个线性表线性表线性表就是数据排列成一条先一样的结构,每个线性表上的数据最多只有前和后两个方向。除了数组,链表,队列,栈等也是线性表结构非线性表二叉树,堆,图等。之所以是非线性,是因为数据之间并不是简单的前后关系。...原创 2019-01-04 09:58:14 · 9077 阅读 · 0 评论