Git和排序算法 | 青训营笔记

220 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第11篇笔记

GO-学习笔记

Git

  • 协同工作,分布式版本控制
  • 每个库都有完整的提交历史,每次提交都是完整的文件快照
  • git init初始化
  1. --initial-branch 指定初始化分支
  2. --bare 创建裸仓库
  3. --template 通过模版创建构建好的自定义git目录
  • git cat-file -p 9a71f81a4b4754b686fd37cbb3c72d0250d344aa查看暂存区文件
  • git log查看提交记录

配置

  • git config,用户信息配置;别名配置
  1. --global
  2. --system
  3. --local
  4. 低级别覆盖高级别
  • git remote,与远端的仓库连接
  1. git remote add origin_ssh git@github.com:git/git.git添加远程仓库
  2. git remote set-url --add --push origin git@github.com:my_repo/git.git设置push源
  • 生成ssh-ed25519的密钥ssh-keygen -t ed25519 -C "978653881@qq.com"

上传操作

  • git add .上传到本地缓存区 image.png
  • git commit -m "add remote" 提交到git目录,多出目录树文件和commit记录
  1. Blob存储文件内容
  2. Tree存储文件目录信息
  3. Commit存储提交信息,对应唯一版本代码
  4. 通过Commit寻找Tree信息,每个Commit对应唯一的TreeID;通过Tree找到对应的BlobId,找到对应的文件内容 image.png
  • git push origin master同步到远端origin源master分支
  1. 需要解决冲突
  2. git push origin master -f强制推送

分支

  • refs/heads,保存分支信息,和对应的CommitId
  • git checkout -b test创建test分支 image.png
  • 分支提交后,存在一个提交合并的请求,提交请求后,会被合并入主分支 image.png
  • git merge test --ff-only Fast-forward形式合并,没有merge节点 image.png
  • git merge test --no-ff,Three-Way Merge 分支合并 image.png

标签

  • refs/tags稳定版本,指向commitId
  • git tag v0.0.1生成标签 image.png
  • git tag -a v0.0.2 -m "v0.0.2"生成附注标签,其中指向了commitId image.png

拉取

  • 当上传新版本时,通过parent与前一个版本进行关联 image.png
  • git clone
  • git fetch,不会执行merge操作
  • git pull,会执行merge,需要解决冲突
  1. git pull --rebase
  2. git pull origin main拉取最新的代码,与本地合并

修改历史版本信息

  • git commit --amend,生成一个新的commitId,旧的commitId是没有指向的,是悬空的
  • git rebase -i HEAD~3 修改最近三个commit的修改
  • filter --branch 指定删除所有提交中的某个文件或者全局修改邮箱地址

gc

  • git fsck --lost-found查看悬空的commit image.png
  • git reflog expire --expire=now --all 设置为过期,否则无法删除悬空的commit
  • git gc --prune=now,指定过期时间,删除不需要的object,打包压缩减少仓库体积 image.png

保护主分支

image.png

排序算法

  • go <=1.18,混合排序,主体是快速排序

三大排序算法

  • 排序算法
  • 插入排序,不断插入已经排序好的array,找到一个比其小的数,放在后面,不需要准备时间
  1. 最好情况下,有序时 o(n)
  2. 平均 o(n^2)
  3. 最坏情况 o(n^2)
  4. 平均时间复杂度比较高,最好的情况时间复杂度较好
  5. 短序列或元素有序时,性能最好
  • 快速排序,分治思想,直到整体有序
  1. 最好情况下,选择的轴点是中位数,o(n*logn)
  2. 平均 o(n*logn)
  3. 最坏情况 o(n^2)
  4. 大部分情况,性能较好
  • 堆排序,大顶堆,将根节点交换到最后一个位置
  1. 最好情况,o(n*logn)
  2. 平均 o(n*logn)
  3. 最坏情况 o(n*logn)
  4. 性能稳定

qdqsort

  • pattern-defeating-quicksort
  1. 最好情况,o(n)
  2. 平均 o(n*logn)
  3. 最坏情况 o(n*logn)
  • 第一个版本,分情况决策,取长补短
  1. 短序列使用插入排序,长度为12~32,泛型时<=24
  2. 其他情况用快排
  3. 快排表现不佳,用堆排保证;当快排轴点离两端很接近时,当这种情况发生的次数达到了limit后,就使用堆排序
  4. limit,为bits.Len(len),数组长度的需要的比特位的个数
  • 第二个版本,优化快排的轴点选择
  1. 首个元素作为pivot,容易出现极端情况
  2. 遍历数组,找真正的中位数,代价很高
  3. 寻找近似中位数,短序列,选择固定元素;中序列,采样三个元素;长序列,采样九个元素
  4. 探知序列的能力,采样元素的特点,如果逆序,翻转整个序列;如果顺序,使用插入排序,限制次数,防止达到最坏情况
  • 第三个版本,优化重复度较高的情况
  1. 快排中,两次partition生成的pivot相同,判定进行了无效分割,使用partitionEqual将重复元素排列在一起
  2. pivot选择策略不佳,随机交换元素