{"id":28600949,"url":"https://github.com/oldthreefeng/algo","last_synced_at":"2025-06-11T14:39:30.653Z","repository":{"id":114576118,"uuid":"283664419","full_name":"oldthreefeng/algo","owner":"oldthreefeng","description":"learn algorithms ","archived":false,"fork":false,"pushed_at":"2020-08-22T02:51:18.000Z","size":3532,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-06-20T13:37:09.441Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oldthreefeng.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-07-30T03:55:33.000Z","updated_at":"2020-08-22T02:51:20.000Z","dependencies_parsed_at":"2024-06-20T13:15:50.497Z","dependency_job_id":null,"html_url":"https://github.com/oldthreefeng/algo","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldthreefeng%2Falgo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldthreefeng%2Falgo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldthreefeng%2Falgo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldthreefeng%2Falgo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oldthreefeng","download_url":"https://codeload.github.com/oldthreefeng/algo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldthreefeng%2Falgo/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259280932,"owners_count":22833476,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-11T14:39:29.619Z","updated_at":"2025-06-11T14:39:30.608Z","avatar_url":"https://github.com/oldthreefeng.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n[TOC]\n\n# algo\n\n## 稀疏数组(Sparse Array)\n\n\u003e 当一个数组中大部分元素为０，或者为同一个值的数组时，可以使用稀疏数组来保存该数组。\n\u003e 把具有不同值的元素的行列及值记录在一个小规模的数组中，从而 缩小程序的规模\n\n```cgo\n1) 使用稀疏数组，来保留类似前面的二维数组(棋盘、地图等等)\n2) 把稀疏数组存盘，并且可以从新恢复原来的二维数组数\n```\n[sparseArr](sparseArr/main.go)\n\n## 队列(Queue)\n\n\u003e 队列是一个有序列表，可以用 数组或是 链表来实现。\n\u003e\n\u003e 遵循 先入先出的原则。即：先存入队列的数据，要先取出。后存入的要后取出\n\n### singleQueue\n\n\u003e 数组实现有序列表,需要两个变量来进行处理,front和rear,初始值都为-1\n\u003e\n\u003e front指向队首,不包含队首元素;rear指向队尾,包含队尾元素\n\n[SingleQueue](queue/singleQueue.go)\n\n- circleQueue\n\n```cgo\n1) 什么时候表示队列满 (tail + 1) % maxSize = head\n2) tail == head 表示空\n3) 初始化时， tail = 0 head = 0\n4) 怎么统计该队列有多少个元素 (tail + maxSize - head ) % maxSize\n5) 取出和存入数据时,head和tail该如何变化\nhead = (head + 1 + maxSize) % maxSize\ntail = (tail + 1 + maxSize) % maxSize\n\n```\n\n[circleQueue](queue/circleQueue.go)\n\n\n## 链表(Link)\n\n\u003e 链表是有序的列表\n\u003e\n\u003e一般来说，为了比较好的对单链表进行增删改查的操作，我们都会给他设置一个头结点, 头\n 结点的作用主要是用来标识链表头， 本身这个结点不存放数据\n \n ```cgo\n 单向链表\n \n head ==\u003e data / \u0026next ==\u003e data /\u0026next ==\u003e\n[0xc000050360,0,head,,0xc000050390] ==\u003e\n[0xc000050390,1,宋江,及时雨,0xc0000503f0] ==\u003e\n[0xc0000503f0,4,林冲,豹子头,0x0] ==\u003e\n\n双向链表\n\nhead \u003c==\u003e \u0026pre /data / \u0026next \u003c==\u003e \u0026pre /data / \u0026next\n每个字段的含义\ntemp.no, temp.name, temp.nickName, temp.pre,temp, temp.next\n[0,head,,0x0,0xc0000500c0,0xc000050100] \u003c==\u003e\n[1,宋江,及时雨,0xc0000500c0,0xc000050100,0xc000050140] \u003c==\u003e\n[2,卢俊义,玉麒麟,0xc000050100,0xc000050140,0xc000050180] \u003c==\u003e\n[4,林冲,豹子头,0xc000050140,0xc000050180,0xc0000501c0] \u003c==\u003e\n[3,无用,智多星,0xc000050180,0xc0000501c0,0x0] \u003c==\u003e\n```\n\n[singleLink](link/singlelink.go)\n[doubleLink](link/doubleLink.go)\n\n## 循环链表\n\n\u003e 循环链表的特点是无须增加存储量，仅对表的链接方式稍作改变，即可使得表处理更加方便灵活\n\n```\n删除一个环形单向链表的思路\n1. 先让temp指向head\n2. 让tail指向环形列表的结尾\n3. temp和要删除的id进行比较,如果相同,则和tail完成删除(如果删除头结点该如何处理)\n\n```\n\n[singleCircleLink](link/singleCirclelink.go)\n\n```cgo\nJosephu问题：\n设编号为1，2，...n的n个人围坐一圈，约定编号为k（1\u003c=k\u003c=n）的人从1开始报数，\n数到m的那个人出列，它的下一位又从1开始报数，数到m的那个人又出列，依次类推，直到所有人出列为止，\n由此产生一个出队编号的序列。\n\n用一个不带头结点的循环链表来处理Josephu问题：\n先构成一个有n个结点的单循环链表，然后由k结点起从1开始计数，\n计到m时，对应结点从链表中删除，然后再从被删除结点的下一个结点又从1开始计数，\n直到最后一个结点从链表中删除算法结束。\n\n```\n\n[代码实现](link/josephu.go)\n\n## 排序算法(Sort)\n\u003e [百度wiki](https://baike.baidu.com/item/算法) 算法（Algorithm）是指解题方案的准确而完整的描述，是一系列解决问题的清晰指令，算法代表着用系统的方法描述解决问题的策略机制。也就是说，能够对一定规范的输入，在有限时间内获得所要求的输出。如果一个算法有缺陷，或不适合于某个问题，执行这个算法将不会解决这个问题 \n\u003e \n\u003e 建议有数学基础,捡起来\n\n```cgo\n1. 微积分\n2. 离散数学\n3. 概率论\n4. 线性代数\n```\n\n[sort/README](sort/README.md)\n\n## 位运算\n\n1. 判断某一位是否为1\n2. 只改变其中某一位,而保持其他位不变\n\n- 按位与\u0026\n\n```cgo\n\u0026 只有两个二进制位均为1,结果才是1;其他都是0.\n例如: 获取某些变量中的某一位,某些位清0且同事保留其他位不变;\nn = n \u0026 0xffffff00  (低8位置0)\n\n如何判断int型变量n的第7位,(右往左,从0开始).\n```\n\n- 按位或|\n\n```cgo\n| 只有两个二进制有一个1,结果会为1,其他都是0\n例如: 通过用来将变量的某些为置1保留其他位不变\nn|= 0xff (将n的低8位置1)\n\n```\n- 按位异或^\n\n```cgo\n^ 只有两个二进制位不相同,结果才为,其他都是0\n例如: 将某些变种的某些位进行取反,且保留其他位\n特点 如果a^b=c, 那么就有 c^b=a ,c^a=b (穷举法)\n\n```\n假定 A 为60，B 为13\n\n| 运算符 | 描述                                                         | 实例                                   |\n| :----- | :----------------------------------------------------------- | :------------------------------------- |\n| \u0026      | 按位与运算符\"\u0026\"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 | (A \u0026 B) 结果为 12, 二进制为 0000 1100  |\n| \\|     | 按位或运算符\"\\|\"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 | (A \\| B) 结果为 61, 二进制为 0011 1101 |\n| ^      | 按位异或运算符\"^\"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或，当两对应的二进位相异时，结果为1。 | (A ^ B) 结果为 49, 二进制为 0011 0001  |\n| \u003c\u003c     | 左移运算符\"\u003c\u003c\"是双目运算符。左移n位就是乘以2的n次方。 其功能把\"\u003c\u003c\"左边的运算数的各二进位全部左移若干位，由\"\u003c\u003c\"右边的数指定移动的位数，高位丢弃，低位补0。 | A \u003c\u003c 2 结果为 240 ，二进制为 1111 0000 |\n| \u003e\u003e     | 右移运算符\"\u003e\u003e\"是双目运算符。右移n位就是除以2的n次方。 其功能是把\"\u003e\u003e\"左边的运算数的各二进位全部右移若干位，\"\u003e\u003e\"右边的数指定移动的位数。 | A \u003e\u003e 2 结果为 15 ，二进制为 0000 1111  |\n\n[lightOut](./search/lightOut.go)\n\n### 程序或算法的时间复杂度\n\n```cgo\n1. 一个程序或者算法的时间效率,也称时间复杂度,简称'复杂度'\n2. 通常用O(n)来表示,n表示规模.\n3. 平均复杂度和最坏复杂度,可能一致,也可能不一致 //很难达到最坏的复杂度\n4. 只需关心增长最快的那个函数,比如 O(n^2+n^3) ==\u003e O(n^3)\n\nO(1) -\u003e O(log(n) -\u003e O(n) O(n^k) -\u003e O(a^n) -\u003e o(n!)\n\n- 程序算法的时间复杂度\n\n无序数列中,查找某数 O(n)\n平面上右n个点,求任意两点之间的距离  O(n^2)\n冒泡排序\\选择排序\\冒泡排序 O(n^2)\n快速排序 O(n*log n)\n二分查找 O(log n)  --- 猜数游戏,每次查找后缩小到上次的一半.\n\n```\n\n## 分治算法\n\n```\n把一个任务，分成形式和原任务相同，但规模更小的几个部分任务（通常是两个部分），分别完成，或只需要选一部完成。\n然后再处理完成后的这一个或几个部分的结果，实现整个任务的完成。\n```\n\n## 动态规划相关问题\n\n### 数字三角形\n[代码](./recursion/cmd/maxsum.go)\n### 最长公共子序列问题\n[代码](./recursion/cmd/maxlentwostring.go)\n\n### 滑雪\n\n### 神奇的口袋\n\n### 背包问题\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foldthreefeng%2Falgo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foldthreefeng%2Falgo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foldthreefeng%2Falgo/lists"}