数据结构与算法
依然关注
当你的才华还撑不起你的野心的时候,你就应该静下心来学习;当你的能力还驾驭不了你的目标时,就应该沉下心来,历练;梦想,不是浮躁,而是沉淀和积累,只有拼出来的美丽,没有等出来的辉煌,机会永远是留给最渴望的那个人,学会与内心深处的你对话,问问自己,想要怎样的人生,静心学习,耐心沉淀,送给自己,共勉
展开
-
《算法与数据结构》学习笔记1---时间复杂度与空间复杂度(上)
前言 数据结构和算法的重要性相信学计算机的人都知道,一直以来算法和数据结构就是我的心病,相信和大家一样 这门课要说学吧,太难,自己啃不下来。但是不学吧,感觉又好像怎么着似的,弄的人心理不舒服。今在某软件上花重金买了一门《数据结构和算法》课,鼓起勇气认真的学习一次算法和数据结构,希望能对自己有所帮助。正文 数据结构和算法本身解决的是“快”和“省”的问题,即如何让自己写的程序运行的更...转载 2019-02-03 18:21:12 · 212 阅读 · 0 评论 -
《算法与数据结构》学习笔记18---哈希算法
前言 啊,继续学习之旅。 前面几篇提到“散列表”“散列函数”,这里又讲到“哈希算法”,是不是有点一头雾水?实际上,不管是“散列”还是“哈希”,这都是中文翻译的差别,英文其实就是“Hash”。所以,常听到有人把“散列表”叫作“哈希表”“Hash 表”,把“哈希算法”叫作“Hash 算法”或者“散列算法”。正文什么是哈希算法? 将任意长度的二进制值串映射为固定长度的二进制值...转载 2019-02-26 09:25:55 · 235 阅读 · 0 评论 -
《算法与数据结构》学习笔记14---跳表
前言 上篇说到,二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。那么对于链表,只需要对它进行一些改造就可以支持类似“二分”的查找算法。改造之后的数据结构叫做 跳表(Skip list)。 跳表是一种动态数据结构,可以支持快速的插入、删除、查找操作。写起来也不复杂,甚至可以替代 红黑树(Red-black tree)正文跳表 对于一个单链表来讲,即便链表中存...转载 2019-02-20 09:24:59 · 146 阅读 · 0 评论 -
《算法与数据结构》学习笔记17---散列表(3)
前言 有没有发现,有两种数据结构,散列表和链表,经常会被放在一起使用。 在链表篇中,提了到如何用链表来实现 LRU 缓存淘汰算法,但是链表实现的 LRU 缓存淘汰算法的时间复杂度是 O(n),通过散列表可以将这个时间复杂度降低到 O(1)。在跳表篇,提到 Redis 的有序集合是使用跳表来实现的,跳表可以看作一种改进版的链表。Redis 有序集合不仅使用了跳表,还用到了散列表。...转载 2019-02-25 09:45:31 · 203 阅读 · 0 评论 -
《算法与数据结构》学习笔记8---递归
前言 本内容为本人学习笔记,课程来自极客时间数据结构与算法。正文 递归是一种应用广泛的算法,在许多的数据结构和算法的实现中都用到了它,比如深度优先搜索、前序中序后序二叉树的遍历等。举一个感觉有点傻的例子,假如要去电影院看电影,因为各种原因不知道自己现在在第几排,于是你就问前面一排的人他是第几排,你只要在他的数字上加一就知道自己在哪一排了。但是,前面的人也看不清啊,所以他也问他前面...转载 2019-02-14 10:43:54 · 307 阅读 · 0 评论 -
《算法与数据结构》学习笔记13---二分查找
前言 此内容为本人学习笔记。正文 针对有序数据集合的查找算法:二分查找(Binary Search)算法,也叫折半查找算法。二分查找是一种非常简单易懂的快速查找算法,生活中到处可见。比如说,有一个猜字游戏。一人随机写一个 0 到 99 之间的数字,然后另一人来猜第一个人写的是什么。猜的过程中,每猜一次,就会告诉第二个人猜的大了还是小了,直到猜出结果为止。假设只有 10 个订单,...转载 2019-02-19 09:41:32 · 180 阅读 · 0 评论 -
《算法与数据结构》学习笔记19---二叉树(1)
前言开始新旅途。ps:内容仅做为本人的学习笔记。正文树(Tree)二话不说先上图。这里面每个元素叫作“节点”;用来连线相邻节点之间的关系,叫作“父子关系”。A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫作根节点,也就是图中的节点 E。我们把没有子节点的节点叫作叶子节点或者...转载 2019-02-28 11:59:46 · 190 阅读 · 0 评论 -
《算法与数据结构》学习笔记7---队列
前言 本内容源自个人学习笔记,课程内容来处极客时间。正文队列,先进先出。 栈的两个基本操作:入栈push()、出栈pop() 队列的基本操作:入队enqueue() 放一个数据到队列尾部、出队dequeue() 从队列头部取一个元素 用数组实现的队列叫做顺序队列,用链表实现的队列叫链式队列。 作为一种非常基础的数据结构,队列的应用也非常广泛,特别是一些具...转载 2019-02-13 10:52:42 · 149 阅读 · 0 评论 -
《算法与数据结构》学习笔记12---排序优化
如何实现一个通用的、高性能的排序函数?如何选择合适的排序算法?之前讲的几种排序算法:时间复杂度是稳定排序吗是原地排序吗冒泡排序O(n2)是是插入排序O(n2)是是选择排序O(n2)否是快速排序O(nlogn)否是归并排序O(nlogn)是否计数排序O(n+k) k是数据范围是否桶排序O(n)是...转载 2019-02-18 09:36:58 · 114 阅读 · 0 评论 -
《算法与数据结构》学习笔记5---链表(下)
前言 本篇主要介绍写链接代码的一些方法。正文理解指针或引用的含义 看懂链表并不难,难的是将链表与指针混在一起。有些语言有“指针”的概念,如C,有些没有,取代指针的是“引用”,如JAVA、PYTHON。不管是“指针”还是“引用”,其实都是存储所指对象的内存地址。 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址...转载 2019-02-12 09:51:06 · 140 阅读 · 0 评论 -
《算法与数据结构》学习笔记4---链表(上)
前言本次分两篇来记录链表的内容。正文相比数组,链表是一种稍微复杂一点的数据结构。这两个非常基础、非常常用的数据结构,常常将会放到一块儿来比较。两者有什么区别:从底层的存储结构上来看:从下图中我们看到,数组需要一块连续的内存空间来存储,对内存的要求比较高。如果申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。而...转载 2019-02-12 09:49:04 · 194 阅读 · 1 评论 -
《算法与数据结构》学习笔记11---线性排序
开篇 本篇主要介绍三种时间复杂度为O(n)的排序算法:桶排序、计数排序、基数排序。因为这些排序算法的时间复杂度是线性的,所以叫做线性排序(Linear sort)。之所以能做到线性的时间复杂度,主要是因为这三个算法是非基于比较的排序算法,都不涉及元素之间的比较操作桶排序(Bucket sort) 核心思想:将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序...转载 2019-02-17 16:21:22 · 152 阅读 · 0 评论 -
《算法与数据结构》学习笔记3---数组
前言 之前两篇介绍了关于时间、空间复杂度的相关内容,本篇则对数组进行介绍。正文 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。线性表 线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。链表、队列、栈也是线性表结构。有线性表当然就有非线性表,如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表...转载 2019-02-10 16:37:46 · 173 阅读 · 0 评论 -
《算法与数据结构》学习笔记16---散列表(2)
前言 散列表续集。 散列表的查询效率并不能笼统地说成是 O(1)。它跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因子过高,都可能导致散列冲突发生的概率升高,查询效率下降。 在极端情况下,有些恶意的攻击者,还有可能通过精心构造的数据,使得所有的数据经过散列函数之后,都散列到同一个槽里。如果使用的是基于链表的冲突解决方法,那这个时候,散列表就会退化...转载 2019-02-22 09:43:33 · 216 阅读 · 0 评论 -
《算法与数据结构》学习笔记10---排序(下)
前言 本内容来源于个人的学习笔记 。 上一篇主要 是冒泡排序、插入排序、选择排序。本篇的主要内容为归并排序和快速排序。正文归并排序 核心思想:如果要排序一个数组,先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起。 归并排序和快速排序都用到了分治的思想。分治,就是分而治之,将一个大问题分解成小的问题来解决。小的子问题解决了,大...转载 2019-02-16 10:03:20 · 155 阅读 · 0 评论 -
《算法与数据结构》学习笔记2---时间复杂度与空间复杂度(下)
前言上一篇介绍了时间复杂度和空间复杂度的概念,这一篇关注最好情况时间复杂度、最坏情况时间复杂度、平均情况时间复杂度、均摊时间复杂度。正文最好情况时间复杂度:在最理想的情况下,执行代码的时间复杂度。最情况坏时间复杂度:在最糟糕的情况下,执行代码的时间复杂度。例:// n表示数组 array 的长度int find(int[] ,int n, int x) { int i = 0...转载 2019-02-06 17:04:30 · 159 阅读 · 0 评论 -
《算法与数据结构》学习笔记9---排序
前言 本内容为自己的学习笔记,来源于极客时间课程。 排序,排序,万恶的排序啊。正文如何分析一个“排序算法”?排序算法的执行效率最好情况、最坏情况、平均情况时间复杂度 我们在分析排序算法的时间复杂度时,要分别给出最好情况、最坏情况、平均情况下的时间复杂度。除此之外,你还要说出最好、最坏时间复杂度对应的要排序的原始数据是什么样的。 为什么要区分这三种时间复...转载 2019-02-15 09:15:53 · 162 阅读 · 0 评论 -
《算法与数据结构》学习笔记15---散列表(1)
前言 关于散列表内容的学习笔记分三篇来记录。正文 散列表,Hash Table,也叫哈希表或Hash表。散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。散列思想例一: 假如有 89 名选手参加学校运动会。为了方便记录成绩,每个选手胸前都会贴上自己的参赛号码。这 89 名选手的编号依次...转载 2019-02-21 09:13:55 · 198 阅读 · 0 评论