• 《Go语言的数据结构与算法之美》

  • 价格:免费
  • 状态:全书已完结
  • 在读人数:21
  • 热度:1348
创建者
  • 柠檬酸
  • 13 粉丝 40博客
内容简介
《Go语言的数据结构与算法之美》系列文章,本系列文章主要会包括常见的数据结构与算法实现,同时会包括 Go 标准库代码的分析理解,讲到对应章节的时候优先学习分析 Go 的源码实现,例如 slice、list、sort 等,然后可能会有一些常见的案例实现。
章节目录
  • 第一章 基本数据结构
  • 1.1 链表
  • 什么是链表? 单链表 1.链表通过指针将零散的内存数据联系在一起 2.如下图所示,包含两个结构,一个是数据 data,另外一个是下一个节点的内存地址 3.最后一个节点指向 NULL循环链表 和单链表的区别就是,将尾节点指向的头结点,将整个链表组成了一个环状双向链表 和在单链表的
  • 1.2 数组上:深入理解slice
  • 什么是数组? 数组大家应该都非常熟悉我们来简单的回顾一下: 1.数组是一个具有连续的内存空间和相同类型的数据的数据结构 2.我们随机访问任意一个下标的数据的时间复杂度都是 O(1) 3但是正是由于这种特性,导致它插入和删除元素的效率比较低,是 O(n)Go 中的数组 func main() {// 初始化数组var ar
  • 1.3 数组下:使用 GDB 调试 Golang 代码
  • 问题回顾 本文章主要是为了回答上一篇文章的问题,并且介绍一下在这个过程中以及后续都会使用到的调试工具 gdb 请查看下面一段代码,会输出什么,为什么? A: 5 8 B: 8 8 C: 5 5 D: 5 6 package mainimport ("fmt" )func main() {s: = [] int {1, 2}s = append(s, 3, 4, 5)fmt.
  • 1.4 栈上: 如何实现一个计算器
  • 定义 栈是一种“操作受限”的线性表,后进者先出,先进者后出。 比较典型的例子就是我们在叠盘子的时候,叠的时候从下到上一个一个磊起来,取的时候,再从上到下一个一个的拿出来。 说到先入后出这种特性,在 Go 中你第一时间想到了什么?不知道是否和我的答案一样, defer 实现 存在两种实现方式,第一种是数组实现的顺序栈,第二种是链表链式栈数组实现 数组实现我们
  • 1.5 栈下: 深入理解 defer
  • 上篇文章中我们讲到栈的时候说到先入后出这种特性,在 Go 中第一时间想到的就是 defer 接下来我们就深入理解一下 defer用法 下面先回顾一下基本的用法以及较为常见的坑,文末会给出输出结果,可以先想想会输出什么基本用法 1: 延迟处理,资源清理 // 基本用法:延迟调用,清理资源 func f0
  • 第二章 排序算法
  • 2.1 Shell 排序
  • 希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。步骤 1.设置间隔(传统间隔为 N/2) 2.插入排序 程序示例 传统实现
  • 2.2 冒泡排序
  • 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。步骤: 1.比较相邻的元素(从后往前)。如果第一个比第二个大,就交换他们两个。 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在
  • 3.3 堆排序
  • 堆积排序: 是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点。步骤 1.建堆,建堆是不断调整堆的过程,从 len/2 处开始调整,一直到第一个节点,此处 len 是堆中元素的个数。建堆
  • 3.4 归并排序
  • 归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用步骤 1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 2.设定两个指针,最初位置分别为两个已经排序序列的起始位置 3.比较两个指针所指向的元素,选择相对小的元素放入到合并空
  • 3.5 快速排序
  • 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(n log n)次比较。在最坏状况下则需要 Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需
  • 3.6 插入排序
  • 说明 插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。步骤 1.从第一个元素开始,该元素可以认为已经被排序 2.取出下一个元素,在已经排序的元素序
  • 3.7 选择排序
  • 说明 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所
  • 第三章 其它算法
  • 3.1 最短路径算法-Dijkstra
  • 算法描述这个算法是通过为每个顶点 v 保留目前为止所找到的从 s 到 v 的最短路径来工作的。初始时,原点 s 的路径权重被赋为 0 (d[s] = 0)。若对于顶点 s 存在能直接到达的边(s,m),则把 d[m]设为 w(s, m),同时把所有其他(s 不能直接到达的)顶点的路径长度设为无穷大,即表示我们不知
  • 3.2 邻接表
  • 最简单直接的办法一般就是使用邻接矩阵的办法来表示图,但是对于稀疏图来说边的数目想对来说比较少的情况下,使用邻接矩阵的办法会比较浪费资源,所以这里采用邻接表Github https://github.co
  • 3.3 最短路径算法-Floyd
  • 在上一篇当中讲了 Dijkstra 算法,Dijkstra 适用于对于单源路径的求取,但是对于任意两个点之间的最小路径呢?首先想到的当然是直接使用多次的 Dijkstra 算法来求取任意两点之间的最短路径,但是这样下来时间复杂度会比较大,所以使用一种新的算法,Floyd 算法来求取最短路径原理 Floyd 算法是一个经典的动态规划算法。用通俗的
  • 3.4 最短路径算法-SPFA
  • 前面说了单源最短路径算法 Dijkstra,以及多源最短路径算法 Floyd,但是都不能适用于有负权边存在的情况,这里实现一下是西南交通大学段凡丁于 1994 年发表的 SPFA(Shortest Path Faster Algorithm)算法。该算法在 Bellman-ford 算法的基础上加上一个队列优化,减少了
  • 3.5 遗传算法
  • 实现示例-Golangpackage GAimport ("fmt""math""math/rand""time" )var (groupSize int //种群大小chromosomeS
  • 总结(全书完)
  • 数据结构和算法是程序员的基本功,值得每一个程序员好好学习。数据结构表示计算机存储数据的方式,算法是完成某个特定任务的过程。
读者评论
  • 你还没登录,点击这里
  • 本书评论
最近这些人在读这本书