
go数据结构与算法
crushcoding
爱好golang 大家一起加油啊
展开
-
go语言实现二叉树
//设置节点type Node struct { Value int Left *Node Right *Node}//设置或者修改的func (node *Node)SetNodeValue (value int) { node.Value = value}//创建一个nodefunc CreateNode(value int) *Node { return &Node{value,nil,nil}}//在2叉树中找到指定的值的节点func (node *Nod原创 2021-09-01 16:51:18 · 428 阅读 · 0 评论 -
如何实现网页爬虫中的网址链接去重功能
一般在爬取网页的时候,会出现大量重复的数据,这个时候我们一般都会选择用map来进行去重的功能,今天介绍一个新的进行去重的数据结构,位图。如果我们要在1000万个范围在1到1亿的数据中去查询是否包含某个值,那么使用map是可以的,但是会浪费很多的空间,我们可以这样做。申请一块大小为1亿的大小的数组,值为bool,我们将所有的数据都放到数组中,只要有数的,就为true,这样查找只需要我们查询这个值在数组中是否为true。当然这样有点浪费空间,我们还可以进行优化,我们可以用bit位来表示是否存在,bit包含原创 2021-08-22 11:19:02 · 316 阅读 · 0 评论 -
哈希冲撞是什么?怎么解决?
哈希冲撞其实哈希表这个数据结构就像一个函数一样,传入一个key,返回一个结果经过哈希函数计算的一个值,那么我们的要求就是当我们输入2个相同key的时候,返回的值应该是相同的,当我们输入的key是不同的时候,返回的一个值应该是相同的,这个时候,我们设计的哈希表才算是成功了。但是实践的时候我们会发现,很多时候,我们会发现输入2个不同的key,会返回2个相同的值,这个时候就出现了哈希冲撞。我们解决的方法有2种开放寻址法:只要出现哈希冲撞,就通过重新探测新的位置的方法来解决冲突。当我们向哈希表插入数原创 2021-08-13 20:25:44 · 349 阅读 · 0 评论 -
二分查找的四种变种问题
当数组中有重复元素的时候,我们找到数组中的第一个出现的给定值的元素:func TwoSort(arr []int,val int) int { l :=0 r :=len(arr) - 1 for l <=r { mid :=(l + r) / 2 if arr[mid] > val { r = mid -1 }else if arr[mid] < val { l = mid + 1 }else { if mid == 0||arr[mid-1]!原创 2021-08-11 22:05:20 · 197 阅读 · 0 评论 -
2021最新go实现二分查找(递归加遍历)
二分查找的时间复杂度:logn。二分查找必须要求数组的是一个已经排列好的数据。链表来使用二分查找也可以,但是时间复杂度很高,是n,所以一般不使用链表二分查找。它一般被使用在有序的数据寻找一个值,但是它也是有局限性的,数据量太大的时候,它需要的数组使用的内存也很大,这样的话就使得资源消耗的过大。二分查找遍历的代码实现:func twoSort(arr []int,target int) int { l:= 0 r:= len(arr) - 1 for l <= r { mid :=原创 2021-08-10 20:17:56 · 290 阅读 · 0 评论 -
go实现桶排序,基数排序,计数排序
桶排序和计数排序实现原理: 这里直接说一个例子,更容易理解,就是我们要把一百万个数进行排序,我们可以先把这些数分组到一个一个桶里面,如果数都是随机的,比如说范围是1到无限大,那么这个时候我们就需要自己设一点范围,比如1到一万,一万到千万~~将这些数分到桶里之后,我们只需要将桶里面的数进行排序,里面的数排序完之后,拿出来就直接都是排好序了的。我在查资料的时候发现,计数排序就是桶排序的简单版本,例子: 我要查一百万个人的分数,那么我们的分数只有1到100,那么我们可以给每一个分数都划为一个桶,这个时候,就是原创 2021-08-08 22:28:23 · 258 阅读 · 0 评论 -
2021最新go实现归并排序和快速排序(稳定性,时间复杂度,空间复杂度)
归并排序时间复杂度:nlog(n) (在任何情况下都是这个)缺点 : 它不是一个原地的排序算法空间复杂度 : n+logn (n是申请的切片的空间,logn是递归用的空间)它是一个稳定的排序算法(这个只要在我们代码实现的时候注意一下位置就好)下面是实现代码://归func mergeSort(arr []int) []int { if len(arr) < 2 { return arr } mid := len(arr) / 2 left := mergeSort(arr[:原创 2021-08-05 15:34:43 · 506 阅读 · 0 评论 -
golang实现3种基本排序(选择排序,冒泡排序,插入排序)及稳定性和复杂度分析
package mainimport "fmt"//遍历数组,把这个数组分为一个已经排序的空间,一个分为没排序的空间//最好时间复杂度为o(n) 最坏为n的平方//平均复杂度为n的平方,它是一个稳定的排序算法func charusort (arr []int) []int { if len(arr) <=1 { return arr } for i :=1 ; i < len(arr) ; i++ { a := arr[i] j :=i - 1 for ; j原创 2021-08-04 15:28:21 · 255 阅读 · 0 评论