
数据结构与算法
算法笔记
yimtcode
这个作者很懒,什么都没留下…
展开
-
数据结构:数组
数据结构:数组Go1.简介数组内存中的一段连续的空间。在增加元素时,如果数组空间不够保存,重新创建一个原数组2倍容量的数组,并将原数组数据拷贝过来,最后在末尾添加需要保存的数据。2.图示3.演示package arrayimport "errors"var ( ErrIndexOut = errors.New("Index out error "))const ( // 默认长度 defaultLength = 8 // 扩容,当空间不够时扩容比率 rate = 2)原创 2021-10-09 23:25:15 · 68 阅读 · 0 评论 -
数据结构:堆栈
数据结构:堆栈1.简介堆栈(Stack)常用数据结构的一种。分为栈底和栈顶,只允许栈顶压入或弹出,后入先出。与队列相似,区别是只能在一头执行,压入或弹出操作。分类静态栈:栈长度固定不可扩容。动态栈:栈长度可以动态增加。2.图示3.演示package stacktype Stack struct { arr []interface{}}func (s *Stack) Push(obj interface{}) { s.arr = append(s.arr, obj)}原创 2021-10-28 22:55:49 · 275 阅读 · 0 评论 -
算法 | 字符串所有组合
算法 | 字符串所有组合1. 简介通过递归交换位置,找到所有可能的的结果。如果需要对结果去重可以使用类似Set数据结构保存结果数据。2. 演示func main() { list := []string{"a", "b", "c"} combination(list, 0)}func combination(strs []string, index int) { if index == len(strs)-1 { fmt.Println(strings.Join(strs, ""原创 2022-04-10 16:31:58 · 415 阅读 · 0 评论 -
算法:贝尔曼-福特算法
算法:贝尔曼-福特算法1.简介贝尔曼-福特算法(Bellman–Ford algorithm)是一个查找最短路径算法主要优点是支持负权重,但时间复杂度较高,还会有负权环的问题。如果不需要权重应该使用广度优先或深度优先算法,如果只需要权重没有负权重,应该使用迪杰斯特拉算法,上面三种算法性能都会比贝尔曼-福特算法好很多。2.图示从A去D点路线,A->B->C->D负权环问题正常情况下A->B->C->D的权重是3,是最近的一条路线。但是如果碰到下面这种情况就会原创 2021-10-29 19:51:23 · 877 阅读 · 0 评论 -
算法:深度优先搜索
算法:深度优先搜索1.简介深度优先搜索(Depth First Search)是针对图或二叉对的遍历方法。与广度优先搜索类似,深度优先搜索先遍以树叉的纵深长度为优先遍历,而广度优先搜索以树叉分分叉点数量为优先。2.图示以A节点为启始节点,查找F节点流程。3.演示package mainimport "fmt"func main() { graph := make(map[string][]string) graph["A"] = []string{"B", "C"} graph[原创 2021-10-19 21:24:16 · 337 阅读 · 0 评论 -
算法:动态规划
算法:动态规划1.简介将一个大的问题问题拆成小的问题,先解决小的问题从而解决大的问题。2.示例以查找"vista"与"hish"中最长相同子串为例。以"vista"与"hish"建立一个表,按字符依次比较。如果不相同设置相同字符数为0,如果相同获取两边上一个字母(x-i,y-1)累计相同字符数,将其+1保存到当前位置。遍历整张表,计录累计相同字符数最大的位置,这样就能取得长相同子串。vistah00000i01000s0020原创 2021-10-07 19:53:45 · 70 阅读 · 0 评论 -
排序算法:选择排序
排序算法:选择排序1.简介从无序数据中取出最小一个放入有序数据中,一直重复直到不存在无序数据。2.图示3.演示package mainimport "fmt"func main() { arr := []int{5, 3, 2, 1, 4} newArr := selectionSort(arr) fmt.Println(newArr)}func findSmallestIndex(arr []int) int { smallestIndex := 0 smallest原创 2021-10-07 19:26:37 · 64 阅读 · 0 评论 -
算法:贪心算法
算法:贪心算法1.简介简介:贪心算法(又称贪婪算法)每步都选择局部最优解,最终得到的就是全局最优解。算法逻辑:重复选择局部最优解,直到没有可选择。2.注意示例原型来自《图解算法》如下图所示,当前有个背包可以装35磅。现在有音响、笔记本、吉他可以放入背包,求怎么放入背包的价值最高?如果使用贪心算法,会选择价格最高能放入东西,会把音响放进去,这时背包价值为3000。但实际上如果不放音响选择笔记本+吉他话,背包价格能到3500。贪心算法选择局部最优解,可能会出现不是全局最优解。3.演示原创 2021-09-29 21:16:28 · 113 阅读 · 0 评论 -
算法 | 狄克斯特拉算法
迪杰斯特拉算法(Ddijkstra algorithm)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。原创 2021-09-29 21:14:15 · 1123 阅读 · 0 评论 -
算法:广度优先搜索
查找算法:广度优先搜索1.简介简介:广度优先搜索算法(又称宽度优先搜索算法)属于一种盲目搜寻法,通过遍历图上所有节点寻找目标。算法逻辑:以下面图为例遍历A节点所有相邻节点(B、C)查找是否有目标节点。如果找到直接退出,没有找到遍历B、C相邻节点(D、E、F、G)是否有目标节点。如果找到直接退出,没有找到继续向下遍历。这样一直遍历下去,直到找到目标或者整个图遍历完,注意已遍历节点不要重复遍历。解决问题:从A节点出发,是否有前往D节点路线。从A节点出发,前往D节点最短路径。注意:原创 2021-09-29 21:11:06 · 531 阅读 · 0 评论 -
插入排序算法:折半插入排序
插入排序算法:折半插入排序1.简介插入排序算法思想:将待排序元素分为已排序子集和待排序子集,依次从待排序子集选择一个元素插入到已排序子集中,使已排序子集仍然有序。重复以上过程直到所有元素都有序为止。排序规则:假总共有n个需要排序,那么待排序有n-1,第1个元素默认有序以索引1切分,前面为有序子集,后面为无序子集将无序子集中取出1个元素a,按折半查找(二分查找)从有序子集中找到第一个大于a的位置b,从位置b开始的所有有序子集元素向右偏移1位,在a放入到位置b。如果有序子集中没有数据大于a,将a放原创 2021-07-25 22:29:30 · 811 阅读 · 0 评论 -
洗牌算法:随机交换洗牌
洗牌算法:随机交换洗牌1. 简介将数据从前向后遍历,将当前元素随机与任意一个元素做交换。2. 演示2.1. 文件树型图shuffle├── go.mod├── shuffle.go└── shuffle_test.go2.2. 代码shuffle.gopackage shuffleimport ( "math/rand" "time")func RandomSwapShuffle(data []int) { random := rand.New(rand.NewSou原创 2020-12-06 20:02:52 · 232 阅读 · 0 评论 -
排序算法:直接插入排序
排序算法:直接插入排序插入排序1. 简介直接插入排序是一种最简单的插入排序。如果初始有n个需要排序,那么需要排序的总共有n-1个第1个数据默认有序。循环从索引1开始分割前面分为有序数组,后面分为无序数组。并将每次分割的有序数组从后向前与分割索引的数据比较,如果大于分割最引数据就将数据向后移1位,最后将分割索引数据保存到最后向后移动数据的位置。2. 图示3. 演示3.1. 文件树型图insertsort├── go.mod├── insert_sort.go└── insert原创 2020-11-15 21:05:36 · 162 阅读 · 0 评论 -
排序算法:快速排序
排序算法:快速排序交换排序1. 简介快速排序是对冒泡算法的一种改进。基本原理:以第1个元素数据为枢轴,第1个元素索引为低位索引,最后1个元素索引为高位索引, 高位从后向前遍历并判断大小。如果低位元素小于高位元素不操作高位继续向前遍历,否则将高位的数据保存到低位上并将低位索引向后移1位,低位从前向后遍历并判断大小。如果低位元素小于高位元素不操作低位继续向后遍历,否则将低位的数据保存到高位上并将高位索引向前移1们,重新开始高位从后向前遍历判断大小。一直重复下去直到低位索引不小于高位索引,将枢原创 2020-11-07 12:51:53 · 236 阅读 · 0 评论 -
排序算法:冒泡排序
排序算法:冒泡排序冒泡排序是一种简单的交换排序的算法,它通过交换相邻的两个数据元素,逐步将待排序序列变成有序序列。1. 冒泡排序1.1. 简介从左往右将相邻的两个元素进行比较,如果第1个元素大于第2个元素,交换两个元素的位置。这样比较下去每轮最右边都是当前最大的元素,然后去除已找出来的最大元素,在剩余元素中继续找最大元素一直重置下去。1.2. 图示1.3. 演示1.3.1. 文件树形图bubblesort├── bubble_sort.go├── bubble_sort_test.原创 2020-10-19 20:00:33 · 179 阅读 · 0 评论 -
算法 | 分块查找
算法 | 分块查找1. 简介分块查找也称为索引顺序表查找。分块查找就是将顺序表(主表)分成若干个子表,然后为每个子表建立一个索引表,利用索引在其中一个子表中查找。两部分:索引表:存储顺序表的每个子表的开始索引和最大值。顺序表:主表所有数据存放的位置。1.1. 条件子表内可以是无序的,但是子表之前面的子表中每个元素必须小于后面子表中的每个元素。1.2. 分块纯个人的一些理解,欢迎一起沟通交流1.2.1. 前言我第一次看分块查找时也十分纠结应该怎么分块每个子表数据应该多长,什么原创 2020-10-13 19:59:29 · 13488 阅读 · 1 评论 -
查找算法:顺序查找
查找算法:顺序查找1. 简介1.1. 算法思想顺序查找,从表的开端,逐个将需要查找数据与表中数据比较,如果需要查找数据与表中数据相等,则查找成功。如果整张表遍历完没有找到相等,查找失败。1.2. 效率n+12 \frac{n+1}{2} 2n+12. 图示[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x9LCYL2y-1602382587686)(_v_images/20201003225759358_2109543624.png =600x)][外链图片原创 2020-10-11 10:17:46 · 373 阅读 · 0 评论 -
算法 | 二分查找
将一个有序数组一分为二,将查找的数据与切分点比较,在哪一块区间。在将所在区间一分为二,将查找的数据与切分点比较,在哪一块区间…:查找速度快:数据必须有序。原创 2020-09-20 11:10:44 · 275 阅读 · 0 评论