数据结构与算法
汤姆鱼
微信公众号「汤姆鱼」
展开
-
数据结构与与算法之二分法查找
二分法思想:举个例子:猜字游戏;随机写一个0到99之间的数字,然后猜猜写出的数字。猜的过程中,每猜一次,只会告诉您猜的大了还是小了,知道猜中为止。假设写出的数字是23,你可以按照下面的步骤来试一试。(如果猜测范围的数字有偶数个,中间数有两个,就选择较小的那个)。 7次就猜出来了,是不是很快,这个例子用的是二分思想,按照这个思想,即便猜的是0到999的数字,最多也只要10...原创 2019-01-08 18:45:49 · 6919 阅读 · 0 评论 -
数据结构与算法之排序优化篇
一、如何选择合适的排序算法?如果要实现一个通用的、高效率的排序算法,我们应该选择哪种排序算法?下面是几种常见排序算法。前面的学习过,线性排序算法的时间复杂度比较低,适用的场景比较特殊。所以如果要写一个通用的排序函数,不能选择线性排序算法。如果对小规模数据进行排序,可以选择时间复杂度是O(n^2)的算法;如果对大规模的数据进行排序,时间复杂度是O(nlogn)的算法更加高效。所以,为...原创 2018-12-20 19:07:38 · 402 阅读 · 0 评论 -
数据结构与算法之排序篇(下)
在数据结构与算法之排序篇(上),我们学到了冒泡排序、插入排序、选择排序这三种排序算法,他们的时间复杂度都是O(n^2)比较高,适合小规模数据的排序。今天来学习两种复杂度为O(nlogn) 的排序算法,归并排序和快速排序,这两种排序算法适合大规模的数据排序。一、归并排序 (1)、什么是归并排序? 如果要排序一个数组,我们把数组从中间分成前后两个部分,然后对前后...原创 2018-12-05 19:04:10 · 258 阅读 · 0 评论 -
数据结构与算法之排序篇(上)
1、如何分析一个"排序算法"?学习排序算法,我们除了学习它的算法原理、代码之外,更重要的是学会如何评价、分析一个排序算法。那分析一个排序算法,要从哪几个方面入手呢? 排序算法的执行效率对于排序算法执行效率的分析,我们一般会从 几个方面来衡量:1、最好情况、最坏情况、平均情况时间复杂度我们在分析排序算法的时间复杂度时,要分别给出最好情况、最坏情况、平均情况下的时间复杂度。除此...原创 2018-11-27 00:07:12 · 287 阅读 · 0 评论 -
数据结构与算法之线性排序篇
1、线性排序排序算法的时间复杂度是线性的;之所以这种算法额能做到线性的时间复杂度,主要原因是:这个算法是非基于比较的排序算法,都不涉及元素之间的比较操作;2、三种线性排序:桶排序、计数排序、基数排序;3、桶排序(Bucket sort)核心思想:将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶内的数据按照顺序依次取出,组成的序列就是有序...原创 2018-12-17 22:56:41 · 1139 阅读 · 0 评论 -
数据结构与算法之递归篇
1、背景现在很多App都有这个功能。用户A来推荐用户B来注册,用户B又推荐了用户C来注册,我们可以说,用户C的“最终推荐人”为用户A,用户B的"最终推荐按人”也为用户A,而用户A没有"最终推荐人"。一般来说,我们会通过数据库来记录这种推荐关系。在数据库表中,我们可以记录两行数据,其中actor_id表示用户id,referrer_id表示推荐人id.那么给定一个用户ID,如何查找这...原创 2018-11-21 15:36:07 · 608 阅读 · 0 评论 -
数据结构与算法之队列篇
1、如何理解"队列"?类比栈,栈只支持两个基本操作:入栈push()和出栈pop()。对于队列的基本操作也只有两个:入队enqueue(),放一个数据到队列尾部;出队dequeue(),从队列头部去一个元素。(如下图)2、顺序队列和循环队列用数组实现的队列叫做顺序队列,用链表实现的队列叫做链式队列。队列具有先进先出的特性,支持在队尾插入元素,在队头删除元素。(1)、 顺序...原创 2018-11-18 17:17:24 · 360 阅读 · 0 评论 -
数据结构与算法之栈篇
1、如何理解“栈”? 栈是一种典型“后进者先出,先进者后出”的结构。从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。2、如何让实现一个“栈”? 对于栈,主要包含两个操作,入栈和出栈,也就是在栈顶插入一个数据和从栈顶删除一个数据,实际上栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈我们叫做顺序栈,用链表实现的栈,我们叫作链式栈。 举...原创 2018-11-17 22:30:59 · 1216 阅读 · 0 评论 -
数据结构与算法之链表篇(下)
Q:如何轻松写出正确的链表代码?总结起来,就是投入时间+技巧;一、投入时间: 只要愿意投入时间,大多数人都是可以学会的,比如说,如果你真能花上一个周末或者一整天时间,就去写链表反转这一个代码,多谢几遍,一直练到能毫不费力地写出Bug free的代码。二、技巧:1、理解技巧或引用的含义链表的结构并不是很难,但是一旦它和指针混在一起,就容易让人摸...原创 2018-11-17 04:29:54 · 239 阅读 · 0 评论 -
数据结构与算法之链表篇(上)
链表作为一种基础的数据结构之一,我们会常常使用到它,接下来就让我们一起学习吧。1、链表的经典应用场景:LRU缓存淘汰算法。2、缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的CPU缓存、数据库缓存、浏览器缓存等等。3、缓存的大小有限,当缓存被用满时,哪些数据应该被保留,这就需要缓存淘汰策略来决定。常见的策略有三种:先进先出策略(FIFO)、最少...原创 2018-11-17 13:05:50 · 231 阅读 · 0 评论 -
数据结构与算法之数组篇
Q1:为什么很多编程语言中,数组都从0开始编号? 举例说明: 从数组存储的内存模型上来看,"下标"最确切的定义应该是"偏移(offset)"。前面也讲到,如果用a来表示数组的首地址,a[0]就是偏移为0的位置,也就是首地址,a[k]就表示k个type_size的位置,所以计算a[k]的内存地址只需要用这个公式: 但是,如果数组从1开始计数,那我们计算数组元素a...原创 2018-11-16 14:19:37 · 417 阅读 · 0 评论 -
数据结构与算法之复杂度分析篇(下)
一、内容 最好情况时间复杂度、最坏情况时间复杂度、平均情况时间复杂度、均摊时间复杂度。二、为什么要引入这几个概念? 有助于我们可以更加全面地表示一段代码的执行效率,同样一段代码,在不同的输入情况下,复杂度量级有可能是不一样的情况。三、最好、最坏情况时间复杂度 (1)、最好情况时间复杂度:在理想情况下,执行这段代码的时间复杂度; ...原创 2018-12-09 19:17:40 · 339 阅读 · 0 评论 -
数据结构与算法之复杂度分析篇(上)
一、内容 最好情况时间复杂度、最坏情况时间复杂度、平均情况时间复杂度、均摊时间复杂度。二、为什么要引入这几个概念? 有助于我们可以更加全面地表示一段代码的执行效率,同样一段代码,在不同的输入情况下,复杂度量级有可能是不一样的情况。三、最好、最坏情况时间复杂度 (1)、最好情况时间复杂度:在理想情况下,执行这段代码的时间复杂度; ...原创 2018-11-15 23:48:22 · 198 阅读 · 0 评论 -
数据结构与算法之入门篇
前言数据结构是计算机软件专业的基础课程,几乎可以说,要想从事编程工作,无论你是否是科班出身,都不可以绕过这部分知识。作为一个非科班出生的我,自然要学这门课程。下面是我学习的总结,希望与大家一起进步。首先让我们明确一下,什么是数据结构?什么是算法?从广义上来讲,数据结构就是指一组数据的存储结构,而算法则是操作数据的一组方法。而一般我们学的是狭义上的数据结构和算法,比如:队列、栈、...原创 2018-11-15 20:37:44 · 230 阅读 · 0 评论