数据结构和算法(Golang实现)(27)查找算法-二叉查找树

二叉查找树 二叉查找树,又叫二叉排序树,二叉搜索树,是一种有特定规则的二叉树,定义如下: 它是一颗二叉树,或者是空树。 左子树所有节点的值都小于它的根节点,右子树所有节点的值都大于它的根节点。 左右子树也是一颗二叉查找树。 二叉查找树的特点是,一直往左儿子往下找左儿子,可以找到最小的元素,一直往右儿子找右儿子,可以找到最大的元素。 看起来,我们可以用它来实现元素排序,可是我们却使用了二叉堆来实现了堆排序,因为二叉查找树不保证是一个平衡的二叉树,最坏情况下二叉查找树会退化成一个链表,也就是所有节点...阅读全文

Segmentfault 2020-04-08 13:32:34 陈星星

数据结构和算法(Golang实现)(26)查找算法-哈希表

哈希表:散列查找 一、线性查找 我们要通过一个键key来查找相应的值value。有一种最简单的方式,就是将键值对存放在链表里,然后遍历链表来查找是否存在key,存在则更新键对应的值,不存在则将键值对链接到链表上。 这种链表查找,最坏的时间复杂度为:O(n),因为可能遍历到链表最后也没找到。 二、散列查找 有一种算法叫散列查找,也称哈希查找,是一种空间换时间的查找算法,依赖的数据结构称为哈希表或散列表:HashTable。 Hash: 翻译为散列,哈希,主要指压缩映射,它将一个比较大的域空间映射到...阅读全文

Segmentfault 2020-04-08 09:32:41 陈星星

数据结构和算法(Golang实现)(25)排序算法-快速排序

快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊。 注:ACM = Association for Computing Machinery,国际计算机学会,世界性的计算机从业员专业组织,创立于1947年,是世界上第一个科学性及教育性计算机学会。 快速排序是对冒泡排序的一种改进,也属于交换类的排序算法。 一、算法介绍 快速排序通过一趟排序将要排序的数据分割成...阅读全文

Segmentfault 2020-04-08 09:32:41 陈星星

数据结构和算法(Golang实现)(24)排序算法-优先队列及堆排序

优先队列及堆排序 堆排序(Heap Sort)由威尔士-加拿大计算机科学家J. W. J. Williams在1964年发明,它利用了二叉堆(A binary heap)的性质实现了排序,并证明了二叉堆数据结构的可用性。同年,美国籍计算机科学家R. W. Floyd在其树排序研究的基础上,发布了一个改进的更好的原地排序的堆排序版本。 堆排序属于选择类排序算法。 一、优先队列 优先队列是一种能完成以下任务的队列:插入一个数值,取出最小或最大的数值(获取数值,并且删除)。 优先队列可以用二叉树来实现...阅读全文

Segmentfault 2020-04-08 09:32:40 陈星星

数据结构和算法(Golang实现)(23)排序算法-归并排序

归并排序 归并排序是一种分治策略的排序算法。它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列。 归并排序首先由著名的现代计算机之父John_von_Neumann在1945年发明,被用在了EDVAC(一台美国早期电子计算机),足足用墨水写了 23 页的排序程序。注:冯·诺依曼(John von Neumann,1903年12月28日-1957年2月8日),美籍匈牙利数学家、计算机科学家、物理学家,是20世纪最重要的数学家之一。 一、算法介绍 我...阅读全文

Segmentfault 2020-04-08 08:32:33 陈星星

数据结构和算法(Golang实现)(22)排序算法-希尔排序

希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机学会月刊发布了一个排序算法,从此名为希尔排序的算法诞生了。 注:ACM = Association for Computing Machinery,国际计算机学会,世界性的计算机从业员专业组织,创立于1947年,是世界上第一个科学性及教育性计算机学会。 希尔排序是直接插入排序的改进版本。因为直接插入...阅读全文

Segmentfault 2020-04-07 22:32:34 陈星星

数据结构和算法(Golang实现)(21)排序算法-插入排序

插入排序 插入排序,一般我们指的是简单插入排序,也可以叫直接插入排序。就是说,每次把一个数插到已经排好序的数列里面形成新的排好序的数列,以此反复。 插入排序属于插入类排序算法。 除了我以外,有些人打扑克时习惯从第二张牌开始,和第一张牌比较,第二张牌如果比第一张牌小那么插入到第一张牌前面,这样前两张牌都排好序了,接着从第三张牌开始,将它插入到已排好序的前两张牌里,形成三张排好序的牌,后面第四张牌继续插入到前面已排好序的三张牌里,直至排序完。 一、算法介绍 举个简单例子,插入排序一个 4 个元素的数...阅读全文

Segmentfault 2020-04-07 22:32:33 陈星星

数据结构和算法(Golang实现)(20)排序算法-选择排序

选择排序 选择排序,一般我们指的是简单选择排序,也可以叫直接选择排序,它不像冒泡排序一样相邻地交换元素,而是通过选择最小的元素,每轮迭代只需交换一次。虽然交换次数比冒泡少很多,但效率和冒泡排序一样的糟糕。 选择排序属于选择类排序算法。 我打扑克牌的时候,会习惯性地从左到右扫描,然后将最小的牌放在最左边,然后从第二张牌开始继续从左到右扫描第二小的牌,放在最小的牌右边,以此反复。选择排序和我玩扑克时的排序特别相似。 一、算法介绍 现在有一堆乱序的数,比如:5 9 1 6 8 14 6 49 25 4...阅读全文

Segmentfault 2020-04-07 21:32:34 陈星星

数据结构和算法(Golang实现)(19)排序算法-冒泡排序

冒泡排序 冒泡排序是大多数人学的第一种排序算法,在面试中,也是问的最多的一种,有时候还要求手写排序代码,因为比较简单。 冒泡排序属于交换类的排序算法。 一、算法介绍 现在有一堆乱序的数,比如:5 9 1 6 8 14 6 49 25 4 6 3。 第一轮迭代:从第一个数开始,依次比较相邻的两个数,如果前面一个数比后面一个数大,那么交换位置,直到处理到最后一个数,最后的这个数是最大的。 第二轮迭代:因为最后一个数已经是最大了,现在重复第一轮迭代的操作,但是只处理到倒数第二个数。 第三轮迭代:因为最...阅读全文

Segmentfault 2020-04-07 19:32:33 陈星星

数据结构和算法(Golang实现)(18)排序算法-前言

排序算法 人类的发展中,我们学会了计数,比如知道小明今天打猎的兔子的数量是多少。另外一方面,我们也需要判断,今天哪个人打猎打得多,我们需要比较。 所以,排序这个很自然的需求就出来了。比如小明打了5只兔子,小王打了8只,还有部落其他一百多个人也打了。我们要论功行赏,谁打得多,谁就奖赏大一点。 如何排序呢,怎么在最快的时间内,找到打兔子最多的人呢,这是一个很朴素的问题。 经过很多年的研究,出现了很多的排序算法,有快的有慢的。比如: 插入类排序有:直接插入排序和希尔排序 选择类排序有:直接选择排序和堆...阅读全文

Segmentfault 2020-04-07 19:32:33 陈星星

数据结构和算法(Golang实现)(17)常见数据结构-树

树 树是一种比较高级的基础数据结构,由n个有限节点组成的具有层次关系的集合。 树的定义: 有节点间的层次关系,分为父节点和子节点。 有唯一一个根节点,该根节点没有父节点。 除了根节点,每个节点有且只有一个父节点。 每一个节点本身以及它的后代也是一棵树,是一个递归的结构。 没有后代的节点称为叶子节点,没有节点的树称为空树。 二叉树:每个节点最多只有两个儿子节点的树。 满二叉树:叶子节点与叶子节点之间的高度差为0的二叉树,即整颗树是满的,树呈满三角形结构。在国外的定义,非叶子节点儿子都是满的树就是满...阅读全文

Segmentfault 2020-04-07 17:32:37 陈星星

数据结构和算法(Golang实现)(16)常见数据结构-字典

字典 我们翻阅书籍时,很多时候都要查找目录,然后定位到我们要的页数,比如我们查找某个英文单词时,会从英语字典里查看单词表目录,然后定位到词的那一页。 计算机中,也有这种需求。 一、字典 字典是存储键值对的数据结构,把一个键和一个值映射起来,一一映射,键不能重复。在某些教程中,这种结构可能称为符号表,关联数组或映射。我们暂且称它为字典,较好理解。 如: 键=>值 "cat"=>2 "dog"=>1 "hen"=>3 我们拿出键cat的值,就是2了。 Golang提供了这一数据结构:map,并且要求...阅读全文

Segmentfault 2020-04-07 17:32:36 陈星星

数据结构和算法(Golang实现)(15)常见数据结构-列表

列表 一、列表 List 我们又经常听到列表 List数据结构,其实这只是更宏观的统称,表示存放数据的队列。 列表List:存放数据,数据按顺序排列,可以依次入队和出队,有序号关系,可以取出某序号的数据。先进先出的队列 (queue)和先进后出的栈(stack)都是列表。大家也经常听说一种叫线性表的数据结构,表示具有相同特性的数据元素的有限序列,实际上就是列表的同义词。 我们一般写算法进行数据计算,数据处理,都需要有个地方来存数据,我们可以使用封装好的数据结构List: 列表的实现有顺序表示或链...阅读全文

Segmentfault 2020-04-07 17:32:36 陈星星

golang检测ip,port

package main import ( "fmt" "net" "os/exec" "strconv" "strings" ) func main() { err := CheckPorts("3306") if err != nil { fmt.Println("端口已存在") } else { fmt.Println("端口不存在") } // GetLocalIps() } //获取本机ip func GetLocalIp() string { addrs, err := net.In...阅读全文

简书 2020-04-07 15:32:49 成功的失败者

leetcode_692

Golang: 思路:topK问题,这题使用了堆 代码如下: type NodeW struct { word string fre int } func topKFrequent2(words []string, k int) []string { mp:=make(map[string]int) for _,v:=range words{ mp[v]++ } var nodes []*NodeW for k,v:=range mp{ node:=NodeW{ word:k, fre:v, }...阅读全文

简书 2020-04-07 15:32:48 淳属虚构

leetcode_725

Golang: 思路:这题是分配糖果的进阶篇,分配链表,这题为了实现简单,没那么在乎空间复杂度,因此最终结果空间复杂度效率较低,也算是在预期之内。 代码如下: func splitListToParts(root *ListNode, k int) []*ListNode { node1:=root var nodes []*ListNode for node1!=nil{ nodes=append(nodes,node1) node1=node1.Next } if len(nodes)<k{...阅读全文

简书 2020-04-07 15:32:48 淳属虚构

要获得中间件开发的Offer,难么?

# 前言本文主要是写给那些想从事中间件开发的同学看的 :)如果你没有这个打算,那么本文的学习路线非但不实用,还可能会影响你正常的工作 :)# 什么是中间件开发?随着国内软件行业的发展,国内互联网公司规模越来越大,业务越来越复杂,随之使用大量的中间件来提高后台服务性能。由此产生了中间件开发和维护人员。诚然,在小公司,中间件,例如缓存,MQ,RPC 等服务,极大可能是由业务开发人员自己维护,或者委托第三方云平台运维(支付一些费用)。但,如果后台开发超过 200 人,基本就会组建自己的中间件或者基础架...阅读全文

简书 2020-04-07 15:32:46 编程的程序员

Hyperledger-Fabric源码分析(开篇)

一直想将前段时间研究fabric1.0源码的一些心得体会分享出来,一是在写的过程中自己可以加深理解,二是有些地方代码是看过了,但是总感觉看得不到位,没到火候。 看过1.0的同学应该知道,shim与cc与peer之间千丝万缕的关系,剪不断理还乱。写了这么多年的Java,确实觉得Golang代码别扭,而且goroutine+channel的组合简直是阅读者大杀器。但是Golang的好处显而易见,如果fabric用Java实现,一倍的代码量都不止,而且性能差很多。扯远了,总之习惯成自然。 鉴于fabr...阅读全文

简书 2020-04-07 15:32:45 小蜗牛爬楼梯