Thanks to visit codestin.com
Credit goes to github.com

Skip to content

qiuhoude/my_go_lib

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

82 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

golang学习库

学习算法 golang版本

数据结构和算法

主要通过 极客时间-数据结构与算法之美 和 慕课网的算法课学习的算法知识, 自己整理出golang版本的基础的算法和数据结构;
基本上每个方法都是单元测试;
里面也有些自己做的leetcode的题目和课程中题目,解答思路都在代码的注释中
其中还有游戏中常用功能的算法问题

时间复杂度

量级

量级: 随数量递增而递增a 公式会把常量和低次项都忽略就得到下面

  • O(1) 常熟阶
  • O(logn) 对数阶
  • O(n) 线性阶
  • O(nlogn) 对数线性阶
  • O(n^2) 指数阶
  • O(n!) 阶乘阶

如何实际验证一个算法的时间复杂度?
可以将测试的数据规模每次比前一次翻倍,然后记录算法消耗的时间,将测试规模与消耗时间画在一个坐标系中, 根据函数图像可以大致判断时间复杂度

数据量级的概念,1s内完成处理 O(n^2) 10^4
O(n) 10^8
O(nlogn) 10^7

分类
  • 最好情况时间复杂度(best case time complexity)
  • 最坏情况时间复杂度(worst case time complexity)
  • 平均情况时间复杂度(average case time complexity)
  • 均摊时间复杂度(amortized time complexity) (golang的slice扩容就需要用到均摊,在扩容的那次的操作会比非扩容操作耗时)

基础数据结构和算法

动态规划问题

动态规划和递归回溯是我觉得在学习算法中感觉最难的部分,特别是动态规划 解题心路历程, 自顶向下思考(有重复子问题加上最优子结构,递归回溯+记忆化搜索),然后转成自底向上的思考(动态规划),列出递推公式求解

动态规划的背包问题总结

背包问题的分类

0-1背包问题 每个元素最多选取一次

循环结构:
外循环nums,内循环target

多维背包问题 0-1背包问题的多个条件

循环结构:
外循环nums,内循环target

完全背包问题 每个元素可以重复选择

循环结构:
不考虑顺序 外循环nums,内循环target
考虑顺序 外循环target,内循环nums

组合背包问题 背包中的物品要考虑顺序

循环结构:
考虑顺序 外循环target,内循环nums

分组背包问题 不止一个背包需要遍历每个背包

循环结构:
最外层每个背包,内层其他背包的循环

问题分类

  • 最值 dp[i] = max/min(dp[i], dp[i-nums]+1)或dp[i] = max/min(dp[i], dp[i-num]+nums)
  • 是否存在 dp[i]=dp[i]||dp[i-num]
  • 排列组合 dp[i]+=dp[i-num]

leetcode

所有的解题思路都在注释中

array相关解题

分区思想(Two pointers)
i,j 同向
┌─────────────────┬─────────────────┬─────────────────┐
│   processed     │    not needed   │      unknown    │
└─────────────────┴─────────────────┴─────────────────┘
0                 i                 j                 n
──────────────────────────────────────────────────────►

[0,i) 已经处理的数据, [i,j) 还没处理的数据 [j,n)

i,j反向 (对撞指针)
┌──────────────────┬────────────────┬─────────────────┐
│  processed       │   unknown      │   processed     │
└──────────────────┴────────────────┴─────────────────┘
0                  i                j                 n
             ─────────►         ◄─────────                  

[0,i) [j,n) 已经处理


二分搜索

  1. 每次都要进区域的缩减 (避免死循环)
  2. 每次缩减都不能把答案排除 (查找模糊值使用,比如,第一个大于某个值)

About

学习算法 golang版本记录

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages