数据结构与算法
文章平均质量分 82
本知识点内容都是《数据结构与算法之美》 的学习笔记,与专栏的一些区别在于:
1,笔记都是浓缩的知识,语言更为简洁;
2,代码都是基于 C++ 编写,与专栏的 JAVA 代码有所区别;
3,每个知识点附带对应 leetcode 练习题,部分可直接运行代码;
4,部分知识点有个人总结和思考。
嵌入式视觉
双非本科,曾4个月考研上岸211硕士,现大厂算法开发工程师,从事视觉算法开发和模型压缩部署工作,终身学习践行者。想要了解更多干货和开源项目,欢迎关注我的公众号-嵌入式视觉。
展开
-
算法图解笔记
编写递归函数时,必须告诉它何时停止,因此,每个递归函数有两个部分:基线条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件则 指的是函数不再调用自己,从而避免形成无限循环。原创 2022-12-03 23:03:57 · 1101 阅读 · 0 评论 -
剑指offer题解(C++版)
剑指offer习题题解,C++版本代码,并附带个人算法题解题方法总结。题目包括数据结构:数组、链表、栈和队列等,以及常见的算法:排序、分治、回溯、递归、贪心、动态规划等。原创 2022-09-23 20:58:59 · 2389 阅读 · 10 评论 -
常见数据结构-数组
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。数组的两个特点是:线性表。连续的内存空间和相同类型的数据(随机访问)。原创 2022-10-10 21:14:52 · 255 阅读 · 0 评论 -
常见数据结构-链表
针对链表的插入、删除操作,需要对插入第一个节点和删除最后一个节点的情况进行特殊处理。head = null 表示链表中没有节点,head 表示头节点,指向链表中的第一个节点。引入哨兵节点,哨兵节点不管链表是否空,head 指针都会已知指向哨兵节点。有哨兵节点的链表叫作带头链表,反之则是不带头链表。利用哨兵简化编程难度的技巧再插入排序、归并排序、动态规划等代码中都有用到。原创 2022-10-10 21:17:53 · 90 阅读 · 0 评论 -
常见数据结构-链表题总结
对于链表环的问题,潜在的一个结论是从快慢指针的相遇点到环的入口节点 B 的距离和头节点到环的入口节点 B 的距离是相等的,即 $AB = CB$。原创 2022-10-10 21:23:23 · 147 阅读 · 2 评论 -
常见数据结构-字符串解题模板
字符串处理这类题目可以分为两类,一类是有前置或者后置空格的,另一类是没有前置和后置空格的。 1、如果有前后置空格,那么必须判断临时字符串非空才能输出,否则会输出空串。原创 2022-10-10 21:25:11 · 121 阅读 · 0 评论 -
常见数据结构-栈先进后出
栈和队列都是一种"操作受限"的线性表(逻辑结构),只允许在一端插入和删除数据;栈的特性是先进后出,队列是先进先出。在项目中当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时应当首选"栈"这种数据结构。原创 2022-10-10 21:29:20 · 1129 阅读 · 0 评论 -
常见数据结构-队列先进先出
队列和栈一样,也是一种抽象的数据结构,操作上具有“先进先出”的特性,队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。原创 2022-10-10 21:30:57 · 1236 阅读 · 0 评论 -
常见数据结构-跳表
简单说跳表(Skip list)就是链表的“二分查找”。redis 的有序集合用的就是跳表算法。跳表是一种各方面性能都比较优秀的动态数据结构,可以支持快速地插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树(Red-black tree)。原创 2022-10-10 21:32:46 · 176 阅读 · 0 评论 -
常见数据结构-散列表(上)理论
散列表的英文叫“Hash Table”,我们平时也叫它“哈希表”或者“Hash 表”,散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,基于数组演化而来。散列表是通过散列函数将“关键字”(键 key)映射为数组下标,并将数据存储在数组下标对应的位置中。当我们按照“关键字”(键)查询元素时,我们再用同样的散列函数,将“关键字”(键 key)转化数组下标,从对应的数组下标的位置取数据(“散列值” Hash 值)。原创 2022-10-10 21:35:15 · 392 阅读 · 0 评论 -
常见数据结构-散列表(中)实战
散列表的查询效率并不能笼统地说成是 $O(1)$。它跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因子过高,都可能导致散列冲突发生的概率升高,查询效率下降。原创 2022-10-11 11:52:21 · 133 阅读 · 0 评论 -
常见数据结构-散列表(下)散列表和链表的组合
散列表和链表这两种数据结构经常被放到一起使用。比如 Redis 的有序集合不仅使用了跳表,还用了散列表。再比如 Java 语言中的 LinkedHashMap 容器,也用到了散列表和链表两种数据结构。原创 2022-10-11 11:52:35 · 513 阅读 · 0 评论 -
常见数据结构-哈希算法
哈希算法也叫 hash 算法或散列算法。哈希算法的定义:将任意长度的二进制串映射为固定长度(一般是 128 bit)的二进制串,这个映射的规则就是哈希算法。而通过原始数据映射之后得到的二进制值串就是哈希值。原创 2022-10-11 13:04:53 · 554 阅读 · 0 评论 -
常见数据结构-二叉树(上)二叉树遍历
完全二叉树之所以这样定义是和二叉树的存储有关的。二叉树的存储有两种方法,一种是基于指针或者引用的二叉链式存储法,一种是基于数组的顺序存储法。链式存储法比较直观,每个节点有三个字段,其中一个存储数据,另外两个是指向左右子节点的指针。我们只要拎住根节点,就可以通过左右子节点的指针,把整棵树都串起来。原创 2022-10-11 13:07:54 · 123 阅读 · 0 评论 -
常见数据结构-二叉树(下)二叉查找树
二叉查找树(Binary Search Tree)是二叉树中最常用的一种类型,也叫二叉搜索树。顾名思义,二叉查找树是为了实现快速查找而生的。二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。二叉查找树的定义是,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值。原创 2022-10-11 13:10:00 · 174 阅读 · 0 评论 -
常见数据结构-红黑树(上)基础
平衡二叉查找树其实有很多种,但是我们一般听到的基本都是红黑树。红黑树的英文是“Red-Black Tree”,简称 R-B Tree。它是一种不严格的平衡二叉查找树。顾名思义,红黑树中的节点,一类被标记为黑色,一类被标记为红色。原创 2022-10-11 13:11:57 · 103 阅读 · 0 评论 -
常见数据结构-图的表示
图和树一样都是非线性表数据结构,但是更复杂。树中的元素我们称为节点,图中的元素我们叫作顶点(vertex)。图中的一个顶点可以与任意其他顶点建立连接关系,这种连接关系叫作边(edge)。有方向的图叫做“有向图”。以此类推,我们把边没有方向的图就叫做“无向图”。原创 2022-10-11 13:15:10 · 757 阅读 · 0 评论 -
深入浅出广度和深度优先搜索算法
算法是基于特定数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。树是图的一种特例(连通无环的图就是树)。原创 2022-10-11 13:18:42 · 734 阅读 · 3 评论 -
深入浅出递归算法-需要满足三个条件
递归是一种应用非常广泛的算法(或者编程技巧)。很多数据结构和算法的编码实现都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等。去的过程叫“递”,回来的过程叫“归”。基本上所有的递归问题都可以用递推公式来表示。原创 2022-10-11 13:22:06 · 2712 阅读 · 0 评论 -
深入浅出二分查找算法
二分查找(Binary Search)算法是一种针对有序且不含重复数据集合的查找算法,时间复杂度为 O(logn) ,二分查找虽然性能比较优秀,但应用场景也比较有限。因为其底层依赖于数组这种结构,所以不适合数据量大的情况。再次,对于较小规模的数据查找,二分查找的优势并不明显,一般直接使用顺序遍历就可以了。二分查找更适合处理静态数据,也就是没有频繁的数据插入、删除操作。原创 2022-10-11 13:24:49 · 237 阅读 · 3 评论 -
深入浅出八种排序算法
排序算法是程序员必须了解和熟悉的一类算法,排序算法有很多种,基础的如:冒泡、插入、选择、快速、归并、计数、基数和桶排序等。原创 2022-10-13 16:20:09 · 419 阅读 · 5 评论 -
深入浅出贪心算法
贪心算法(英语:greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。原创 2022-10-17 20:40:41 · 300 阅读 · 3 评论 -
深入浅出分治算法
分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。分治和递归的区别:分治算法是一种处理问题的思想,递归是一种编程技巧。原创 2022-10-17 20:43:50 · 124 阅读 · 1 评论 -
深入浅出回溯算法
回溯的处理思想,有点类似枚举搜索。暴力枚举所有的解,找到满足期望的解。为了有规律地枚举所有可能的解,避免遗漏和重复,我们把问题求解的过程分为多个阶段。每个阶段,我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路口,另选一种走法继续走。原创 2022-10-17 20:48:03 · 260 阅读 · 0 评论 -
深入浅出动态规划算法(上)
动态规划比较适合用来求解最优问题,比如求最大值、最小值等等。它可以非常显著地降低时间复杂度,提高代码的执行效率。它和递归一样都非常难学,主要学习难点在于求解问题的过程不太符合人类常规的思维方式。原创 2022-10-17 20:52:58 · 214 阅读 · 0 评论 -
深入浅出动态规划算法(中)
一个模型指的是适合用动态规划算法解决的问题的模型,这个模型也被定义为“多阶段决策最优解模型”。具体解释如下:一般是用动态规划来解决最优问题。而解决问题的过程,需要经历多个决策阶段。每个决策阶段都对应着一组状态。然后我们寻找一组决策序列,经过这组决策序列,能够产生最终期望求解的最优值。原创 2022-10-17 20:57:45 · 178 阅读 · 3 评论