算法
编号996
这个作者很懒,什么都没留下…
展开
-
分而治之法 - 二维极点问题
问题描述对于平面上的两个点A(x1,y1),B(x2,y2),如果x1>x1 && y1>y2,则说A支配B,二维极点就是在若干个点中找到不被其他点支配的点例如,对于点集 {2, 4}, {3, 10}, {5, 3}, {6, 8}, {8, 2}, {10, 6}, {13, 5}, {15, 7}极点集合为:{15 7},{6 8},{3 10}暴力解法通过每一个点与其他点比较来判断该点是不是极点时间复杂度为:O(n^2)func twoDimensionMa原创 2022-03-08 10:09:00 · 551 阅读 · 0 评论 -
字符串匹配 - RK算法
名称来由RK 算法的全称叫 Rabin-Karp 算法. 它是由两位发明者 Rabin 和 Karp 的名字来命名的算法.实现思路BF算法的实现思路是对主串n中的每一个连续子串n1,都与模式串m 进行比较,该算法的复杂度为O(m*n)RK算法是在BF算法的基础上做了一些改进:通过字符串hash值比较代替字符串的遍历比较。这样能提交字符串的比较效率,但是并没有提高算法的时间复杂度,因为计算每一个连续子串n1的hash值,也是有时间消耗的,跟遍历比较的时间复杂度一样都是O(m),所有子串的hash值的计原创 2022-03-06 20:22:42 · 460 阅读 · 0 评论 -
字符串匹配 - BF算法
原理首先将原字符串和子串左端对齐,逐一比较;如果第一个字符不能匹配,则子串向后移动一位继续比较;如果第一个字符匹配,则继续比较后续字符,直至全部匹配。时间复杂度时间复杂度:O(MN)示例实现 strStr()代码实现func strStr(haystack string, needle string) int { needleLen := len(needle) if needleLen == 0 { return 0 } idx, e, hlen := -1, false,原创 2022-03-05 07:52:40 · 122 阅读 · 0 评论 -
排序 - 归并排序
思路把一个大的列表拆分成两个小的列表,分别排序,然后在合并成一个列表,小的列表可以再继续递归,这样最终就完成了整个列表的排序时间复杂度O(nlogn)O(nlogn)O(nlogn)使用场景时间复杂度比较稳定,总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn),不适合基本有序的情况实现// 归并排序func MergeSort(arr []int) []int { l := len(arr) if l <= 1 { retu原创 2021-08-15 23:51:27 · 111 阅读 · 0 评论 -
排序算法 - 希尔排序
// Comparable 定义接口type Comparable interface { CompareTo(interface{}) int}// Int 定义类型并实现接口type Int intfunc (i Int) CompareTo(i2 Int) int { i2tmp := int(i2) iTmp := int(i) if iTmp > i2tmp { return 1 } else if iTmp < i2tmp { return -1 .原创 2021-07-26 09:55:03 · 215 阅读 · 0 评论 -
排序 - 插入排序
原理从头开始遍历列表对每一个元素,都向前遍历移动,直到移动到正确的位置。遍历下标之前的元素都是有序的,直到遍历到最后一个元素,整个列表都是有序的了时间复杂度:平均 O(N2/4)O(N^2/4)O(N2/4)最好 O(N−1)O(N-1)O(N−1)最差 O(N2/2)O(N^2/2)O(N2/2)空间复杂度:O(1)O(1)O(1)实现// 定义接口type Comparable interface { CompareTo(interface{}) int}// 定义原创 2021-07-23 14:39:43 · 64 阅读 · 0 评论 -
排序 - 选择排序
原理遍历所有元素,找到最小的元素,把最小元素交换到指定位置,然后在遍历剩余的元素,查找最小元素并交换,直到最后一个元素特点:运行时间和输入的顺序无关。因为每次查找最小元素都要遍历剩余的所有元素,无论输入的顺序如何交换次数最少。因为每次交换,都是把最小元素交换到最终位置,所以交换次数最少时间复杂度:O(n2)空间复杂度:O(1)实现// 定义接口type Comparable interface { CompareTo(interface{}) int}// 定义类型并实现接口原创 2021-07-23 10:26:26 · 72 阅读 · 0 评论 -
加权图最短路径 - 迪克斯特拉算法
问题假设地图上4个点A、B、C、D,有连线表示可通行,并且是单向,连线上标有距离,如何求出A到C的最短路径输入:{A: {B:1,D:3},B:{D:1,C:2},D:{C:1}}输出:3思路由起点开始,一层一层往外遍历,求出起点到每个点的最短路径,那么遍历到终点,从而也就得出了起点到终点的最短路径实现// 定义有向图,通过两级map存储有向图type DirectedGraph map[int]map[int]int// 迪克斯特拉// graph:有向图// start:起点原创 2021-07-22 21:30:48 · 1217 阅读 · 0 评论 -
RK算法
RK算法:RK算法比较的是两个字符串的hash值但是hash值相等,不能完全判断两个字符串相等,还需要逐个字符比较时间复杂度:O(n)package mainimport "fmt"/** * @Description: RK算法实现 * @param s1 主串 * @param s2 模式串 * @return int 匹配成功:返回模式串在主串的第一次出现的位置下标,否则返回-1 */func strRK(s1 string, s2 string) int { //原创 2020-12-12 19:38:03 · 1104 阅读 · 0 评论 -
BF算法
BF算法:Brute Force (暴力算法)时间复杂度:O(nm)package mainimport "fmt"func strBF(s1 string ,s2 string) int { for i1 := range s1 { matched := 1 for i2, v2 := range s2 { if fmt.Sprintf("%d",s1[i2+i1]) != fmt.Sprintf("%d",v2) { matched = 0 break原创 2020-12-12 14:42:33 · 160 阅读 · 0 评论