第一阶段(数据结构和算法)
以极客时间小争哥《数据结构与算法之美》教程为参考,以golang代码为实现语言,修炼内功中。
天天water
不要在该奋斗的年纪,选择安逸。
展开
-
时间和空间复杂度分析
1. 如何分析、统计算法的执行效率和资源消耗 前言:数据结构和算法本身解决的是“快”和“省”的问题,所以,执行效率是算法一个非常重要的考量指标。如何衡量编写的算法代码的执行效率,主要内容就是:时间、空间复杂度分析。 复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半(仅供参考)。 1.1 为什么需要复杂度分析 测试结果非常依赖测试环境 测试结果受数据规模...原创 2020-01-19 11:01:53 · 4232 阅读 · 0 评论 -
数据结构学习笔记(0X06)--排序
1.冒泡排序 思路:冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。 func bubbleSort(arr []int) { if arr == nil { return } flag := false f...原创 2019-12-25 15:18:21 · 4031 阅读 · 0 评论 -
数据结构学习笔记(0X05)--递归
1. 递归需要满足的三个条件是什么? 2. 写好递推代码的关键着手点是什么? 如何避免被一层层的逻辑绕进去? 3. 写递推代码是如何避免堆栈溢出? 4. 写递推代码如何避免重复计算? ...原创 2019-12-25 15:11:58 · 3976 阅读 · 0 评论 -
数据结构学习笔记(0X04)--队列
总结 一、什么是队列? 1.先进者先出,这就是典型的“队列”结构。 2.支持两个操作:入队enqueue(),放一个数据到队尾;出队dequeue(),从队头取一个元素。 3.所以,和栈一样,队列也是一种操作受限的线性表。 二、如何实现队列? 1.队列API public interface Queue<T> { public void enqueue(T item); //入队 pu...原创 2019-12-25 15:10:03 · 3987 阅读 · 0 评论 -
数据结构学习笔记(0X03)--栈
一、什么是栈? 1.后进者先出,先进者后出,这就是典型的“栈”结构。 2.从栈的操作特性来看,是一种“操作受限”的线性表,只允许在端插入和删除数据。 二、为什么需要栈? 1.栈是一种操作受限的数据结构,其操作特性用数组和链表均可实现。 2.但,任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险。 3.所以,当某个数据集合只涉及在...原创 2019-10-24 22:47:59 · 4058 阅读 · 0 评论 -
数据结构学习笔记(0X02)--链表
概念: 1.通过“指针”将一组零散的内存块串联起来使用。 2.插入、删除数据非常快速。 链表基本概念:链表不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用。 最常见的三种链表结构:单链表、双向链表、循环链表。 需要掌握的5个常见的链表操作: 单链表反转; 链表中的环检测; 两个有序链表的合并; 删除链表倒数第n个结点; 求链表的中间结点; 代码实战 1....原创 2019-10-08 16:40:29 · 3991 阅读 · 0 评论 -
数据结构学习笔记(0X01)--数组
一、前言:为什么大部分编程语言的数组都是从0开始编码? 从数组存储的内存模型上来看,“下标”确切的说法就是一种“偏移”,相比从1开始编号,从0开始编号会少一次减法运算,数组作为非常基础的数组结构,通过下标随机访问元素又是非常基础的操作,效率的优化就要尽可能的做到极致。 数组下标从0开始计数,a[k]的内存地址公式为:a[k]_address = base_address + k * type_...原创 2019-07-08 18:08:47 · 4269 阅读 · 0 评论 -
数据结构学习笔记(0X07)--二分查找
二分查找 思路:二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。 go代码实现: 最简单版: func bsearch(nums []int, findNum int) int{ low := 0 hight := len(nums) - 1 for low &...原创 2020-01-01 23:22:51 · 4017 阅读 · 0 评论