算法与数据结构
Tank_in_the_street
微信公号:我就喜欢摸鱼。在那里分享更多有趣的事情
展开
-
数据结构与算法的重温之旅(一)——复杂度分析
最近刷leetCode刷到后面medium级别的题目的时候就越力不从心,于是乎去极客时间那里买了一门数据结构与算法的课来学习一下,本刊是记录自己在这门课程的笔记,如有错误,劳烦勘正。在讲解复杂度分析之前,我们先要知道为什么我们写程序的时候需要算法与数据结构。可能有些人觉得自己随便撸一段代码,保证业务流畅运行不报错就可以了,其实这样的认知是十分肤浅的。你目前的解决方法只是解决了你目前测试当中所遇...原创 2019-05-21 01:25:57 · 259 阅读 · 0 评论 -
数据结构与算法的重温之旅(十一)——桶排序、基数排序和计数排序
今天要讲的三个算法都有一个共同点,与之前讲的排序算法不同,之前讲的算法都是基于比较的,而这里讲的排序算法都是基于非比较的,不涉及元素之间的相互比较。它们的算法时间复杂度是O(n),由于这三个排序算法的时间复杂度都是线性,所以也称为线性排序。下面来讲讲这三个算法的思想和实现。一、桶排序(Bucket sort)桶排序,顾名思义,核心思想是将要排序的数据分到几个有序的桶里,每个桶里...原创 2019-08-08 21:18:35 · 417 阅读 · 0 评论 -
数据结构与算法的重温之旅(番外篇1)——谈谈斐波那契数列
在讲斐波那契数列之前,我们先回顾一下之前在第一篇文章讲复杂度分析里,谈到时间复杂度的时候,讲到时间复杂度有七种,分别是O(1),O(logn),O(n),O(nlogn),O(n^2),O(2^n),O(n!)。前面五种的话其实很容易写出对应的算法来实现相应时间复杂度。比如O(1)时间复杂度在数组的下标取值,链表的插入和删除都是这个时间复杂度;O(logn)时间复杂度可以通过二分查找来实现,二分查...原创 2019-07-25 11:10:24 · 365 阅读 · 0 评论 -
数据结构与算法的重温之旅(十)——归并排序和快速排序
上一节讲到了冒泡排序、插入排序和选择排序,这次进阶讲归并排序和快速排序。一、归并排序(Merge Sort)归并排序其实从字面上就能知道是什么意思,先讲数组切分两半,然后对剩余数组继续切割,直到不可再分割的时候两两比较排序,一块一块的合并成一个数组,这样就变成有序了。如同所示:归并排序使用的就是分治思想。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解...原创 2019-07-24 21:32:27 · 532 阅读 · 0 评论 -
数据结构与算法的重温之旅(九)——三个简单的排序算法
前面的几篇文章讲了一些基础的数据结构类型,这次我们就深入算法,先从简单的排序算法说起。在排序算法中,入门必学的三个算法分别是冒泡排序、插入排序和选择排序。下面就具体讲一下这三个算法的原理和代码实现一、冒泡排序(Bubble Sort)冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该...原创 2019-07-04 21:38:41 · 377 阅读 · 0 评论 -
数据结构与算法的重温之旅(七)——队列
上一章我们讲到了栈,这次我们来讲队列。其实队列和栈有很多相似的地方,比如它们都是线性表,操作都是受限。区别也是比较明显,队列主要是先进先出,和排队一样,但是栈是先进后出。队列的先进先出这两个操作对应的是入队(enqueue)和出队(dequeue),入队是从队尾插入一个元素,出队是从队头使一个元素出队。队列的概念很好理解,基本操作也很容易掌握。作为一种非常基础的数据结构,队列的应用也非常...原创 2019-06-25 01:00:52 · 277 阅读 · 0 评论 -
数据结构与算法的重温之旅(八)——递归
接下来讲的是算法是递归。在讲递归前我们先举个递归的例子。在军训中教官可能会喊道让队员叫号,对18号出列,如果队员彼此都不知道别人甚至自己的号码,处于完全随机的排队状态的话,那么这个时候叫号其实相当于一个递归,即当前一个叫号的时候,我知道前一个人和自己的号码。那什么是递归呢?即函数自己调用自己就是一个递归。但是如果函数一直调用自己的话则有可能会出现堆栈溢出导致程序崩溃,所以严格来说,递归除了自己...原创 2019-06-25 01:01:35 · 302 阅读 · 0 评论 -
数据结构与算法的重温之旅(六)——栈
栈从定义上来讲,是一个操作受限的线性表。栈只支持从一端存入数据和删除数据,即先进后出。先进后出是典型的栈的结构特点,很多实例都有应用到栈的特点来实现,比如浏览器的前进后退功能。栈对比前面所讲的数组和链表,功能上受限了很多,只支持在一段存入数据和删除数据,但是也比他们容易维护,由于只是在一端存入和删除数据,所以数据不会容易出错。栈从实现上可以用数组和链表来实现,数组实现叫顺序栈,链表实现叫链式栈...原创 2019-06-05 21:04:27 · 197 阅读 · 0 评论 -
数据结构与算法的重温之旅(四)——链表
一、链表概念还记得上一篇文章中数组的概念吗,其实数组和链表都是线性表的一种,不过数组与链表有一点不同的是,链表是不需要连续内存空间来存储,它通过指针将一组零散的内存块串联起来使用。链表它的结构五花八门,常用的三种链表结构分别是单链表、双向链表、循环链表和双向循环链表。首先我们先将最简单的单链表。二、单链表上面有讲,链表是通过指针将一组零散的内存块串联在一起,其中这个内存块我们称之为链表...原创 2019-05-25 13:55:32 · 425 阅读 · 0 评论 -
数据结构与算法的重温之旅(五)——如何运用链表
上一篇文章可能讲了太多偏向理论的东西,现在就利用理论来实践一下。本文精选了八道经典的链表实际运用的问题。如果现在都还不能手写一个链表的话建议去上一章按照示例代码重复几遍。一、单链表实现回文字符串问题什么是回文字符串呢?即正着读反着读都一样,比如abbba这个字符串就是一个回文字符串。那如果在面试中别人问了这个问题该如何通过链表来解决了?请大家思考一段时间,想好之后再看下面答案:cla...原创 2019-06-04 17:31:28 · 175 阅读 · 0 评论 -
数据结构与算法的重温之旅(三)——数组
本系列所有文章的代码都是用JavaScript实现,之所以用JavaScript实现是因为它可以直接在浏览器宿主中运行代码,即在浏览器中按f12打开控制台,选择console按钮,在下面空白的文本框把本例的代码黏贴上去回车即可运行。方便各位同学学习和调试。一、前言数组这个概念相信各位同学在日常写代码的时候肯定会经常用到,我们通常用数组作为容器来存储数据。基本上每一种编程语言都有这种数据...原创 2019-05-23 01:20:19 · 220 阅读 · 0 评论 -
数据结构与算法的重温之旅(二)——复杂度进阶分析
一、前言上一篇文章主要是初步的入门了复杂度分析,包括讲了大O表示法、时间复杂度、空间复杂度和他们的复杂程度O(1)O(1)O(1)、O(logn)O(logn)O(logn)、O(n)O(n)O(n)、O(nlogn)O(nlogn)O(nlogn)、O(n)O(n)O(n)、O(n2)O(n^{2})O(n2) 、O(2n)O(2^n)O(2n)、O(n!)O(n!)O(n!)等,那么本章则进...原创 2019-05-22 01:09:41 · 208 阅读 · 0 评论