《Golang学习数据结构和算法》中文版 第2篇
haoteby 2025-05-24 14:19 26 浏览
《Learn Data Structures and Algorithms with Golang》作者:Bhagvan Kommadi
列表(Lists)
列表是元素的一个序列。每个元素带有一个向前或向后的链接,可以连接到另一个元素。元素可以包含其他额外的属性。这种数据结构是一种容器的基本类型。列表有一个可变化的长度,并且与数组相比,开发者能够移除或增加元素更加容易。在列表里的数据项在内存或磁盘上不必是连续的。链表是由Allen Newell, Cliff Shaw和Herbert A. Simon在RAND公司提出的。
首先,可以在Go语言中使用列表,正如下面例子显示的那样;在列表上调用PushBack方法可以新增元素,列表位于container/list包内:
//main package has examples shown
// in Hands-On Data Structures and algorithms with Go book
package main
// importing fmt and container list packages
import (
"fmt"
"container/list"
)
// main method
func main() {
var intList list.List
intList.PushBack(11)
intList.PushBack(23)
intList.PushBack(34)
for element := intList.Front(); element != nil; element=element.Next() {
fmt.Println(element.Value.(int))
}
}
通过for循环遍历这个列表,以及通过Value方法访问这些元素的值。
运行下面的命令:
go run list.go
在下一节里让我们看看元组。
元组(Tuples)
元组是一个有限且排序的元素列表。它是一个把数据分组的数据结构。元组通常是不可改变的顺序集合。元素具有不同数据类型的相关字段。唯一改变元组的方式是改变字段。操作符,例如+和*,可以适用于元组。一条数据库记录可看成一个元组。在下面的例子里,计算整数的幂级数(power series)并且将这个整数的平方和立方作为元组返回:
//main package has examples shown
// in Hands-On Data Structures and algorithms with Go book
package main
// importing fmt package
import (
"fmt"
)
//gets the power series of integer a and returns tuple of square of a
// and cube of a
func powerSeries(a int) (int,int) {
return a*a, a*a*a
}
这个main方法调用powerSeries方法并传3作为参数。平方和立方值从这个方法返回:
// main method
func main() {
var square int
var cube int
square, cube = powerSeries(3)
fmt.Println("Square ", square, "Cube", cube)
}
运行下面的命令:
go run tuples.go
元组在powerSeries函数里被命名,如下面代码所示:
func powerSeries(a int) (square int, cube int) {
square = a*a
cube = square*a
return
}
如果有一个错误,它可以用元组传递,如下面代码所示:
func powerSeries(a int) (int, int, error) {
square = a*a
cube = square*a
return square,cube,nil
}
堆(Heaps)
堆是基于heap属性的数据结构。这种堆数据结构可以用在选择(selection)算法,图(graph)算法,k路归并(k-way merge)算法。例如操作查找,归并,插入,键改变和删除都是在堆上执行。堆是Go语言container/heap包的部分。根据堆排序(最大堆)属性,存储在每个结点上的值都要大于或等于子结点的值。
如果按降序排序,它被认为是最大堆;否则,它是最小堆。堆数据结构是由J.W.J.Williams在1964年为堆排序算法而提出的。它不是一个完全排序的数据结构,而是部分排序的。下面的例子显示了如何使用container/heap包创建一个堆数据结构:
//main package has examples shown
//in Hands-On Data Structures and algorithms with Go book
package main
// importing fmt package and container/heap
import (
"container/heap"
"fmt"
)
// integerHeap a type
type IntegerHeap []int
// IntegerHeap method - gets the length of integerHeap
func (iheap IntegerHeap) Len() int {
return len(iheap)
}
// IntegerHeap method - checks if element of i index is less than j index
func (iheap IntegerHeap) Less(i, j int) bool {
return iheap[i] < iheap[j]
}
// IntegerHeap method -swaps the element of i to j index
func (iheap IntegerHeap) Swap(i, j int) {
iheap[i], iheap[j] = iheap[j], iheap[i]
}
IntegerHeap 类型有一个Push方法,可以把带interface值的项推进:
//IntegerHeap method -pushes the item
func (iheap *IntegerHeap) Push(heapintf interface{}) {
*iheap = append(*iheap, heapintf.(int))
}
//IntegerHeap method -pops the item from the heap
func (iheap *IntegerHeap) Pop() interface{} {
var n int
var x1 int
var previous IntegerHeap = *iheap
n = len(previous)
x1 = previous[n-1]
*iheap = previous[0 : n-1]
return x1
}
// main method
func main() {
var intHeap *IntegerHeap = &IntegerHeap{1,4,5}
heap.Init(intHeap)
heap.Push(intHeap, 2)
fmt.Printf("minimum: %d\n", (*intHeap)[0])
for intHeap.Len() > 0 {
fmt.Printf("%d \n", heap.Pop(intHeap))
}
}
运行下面的命令:
go run heap.go
让我们在下一节里看看结构设计模式。
相关推荐
- 一日一技:用Python程序将十进制转换为二进制
-
用Python程序将十进制转换为二进制通过将数字连续除以2并以相反顺序打印其余部分,将十进制数转换为二进制。在下面的程序中,我们将学习使用递归函数将十进制数转换为二进制数,代码如下:...
- 十进制转化成二进制你会吗?#数学思维
-
六年级奥赛起跑线:抽屉原理揭秘。同学们好,我是你们的奥耀老师。今天一起来学习奥赛起跑线第三讲二进制计数法。例一:把十进制五十三化成二进制数是多少?首先十进制就是满十进一,二进制就是满二进一。二进制每个...
- 二进制、十进制、八进制和十六进制,它们之间是如何转换的?
-
在学习进制时总会遇到多种进制转换的时候,学会它们之间的转换方法也是必须的,这里分享一下几种进制之间转换的方法,也分享两个好用的转换工具,使用它们能够大幅度的提升你的办公和学习效率,感兴趣的小伙伴记得点...
- c语言-2进制转10进制_c语言 二进制转十进制
-
#include<stdio.h>intmain(){charch;inta=0;...
- 二进制、八进制、十进制和十六进制数制转换
-
一、数制1、什么是数制数制是计数进位的简称。也就是由低位向高位进位计数的方法。2、常用数制计算机中常用的数制有二进制、八进制、十进制和十六进制。...
- 二进制、十进制、八进制、十六进制间的相互转换函数
-
二进制、十进制、八进制、十六进制间的相互转换函数1、输入任意一个十进制的整数,将其分别转换为二进制、八进制、十六进制。2、程序代码如下:#include<iostream>usingna...
- 二进制、八进制、十进制和十六进制等常用数制及其相互转换
-
从大学开始系统的接触计算机专业,到现在已经过去十几年了,今天整理一下基础的进制转换,希望给还在上高中的表妹一个入门的引导,早日熟悉这个行业。一、二进制、八进制、十进制和十六进制是如何定义的?二进制是B...
- 二进制如何转换成十进制?_二进制如何转换成十进制例子图解
-
随着社会的发展,电器维修由继电器时代逐渐被PLC,变频器,触摸屏等工控时代所替代,特别是plc编程,其数据逻辑往往涉及到数制二进制,那么二进制到底是什么呢?它和十进制又有什么区别和联系呢?下面和朋友们...
- 二进制与十进制的相互转换_二进制和十进制之间转换
-
很多同学在刚开始接触计算机语言的时候,都会了解计算机的世界里面大多都是二进制来表达现实世界的任何事物的。当然现实世界的事务有很多很多,就拿最简单的数字,我们经常看到的数字大多都是十进制的形式,例如:我...
- 十进制如何转换为二进制,二进制如何转换为十进制
-
用十进制除以2,除的断的,商用0表示;除不断的,商用1表示余0时结束假如十进制用X表示,用十进制除以2,即x/2除以2后为整数的(除的断的),商用0表示;除以2除不断的,商用1表示除完后的商0或1...
- 十进制数如何转换为二进制数_十进制数如何转换为二进制数举例说明
-
我们经常听到十进制数和二进制数,电脑中也经常使用二进制数来进行计算,但是很多人却不清楚十进制数和二进制数是怎样进行转换的,下面就来看看,十进制数转换为二进制数的方法。正整数转二进制...
- 二进制转化为十进制,你会做吗?一起来试试吧
-
今天孩子问把二进制表示的110101改写成十进制数怎么做呀?,“二进制”简单来说就是“满二进一”,只用0和1共两个数字表示,同理我们平常接触到的“十进制”是“满十进一”,只用0-9共十个数字表示。如果...
- Mac终于能正常打游戏了!苹果正逐渐淘汰Rosetta转译
-
Mac玩家苦转译久矣!WWDC2025苹果正式宣判Rosetta死刑,原生游戏时代终于杀到。Metal4光追和AI插帧技术直接掀桌,连Steam都连夜扛着ARM架构投诚了。看到《赛博朋克2077》...
- 怎么把视频的声音提出来转为音频?音频提取,11款工具实测搞定
-
想把视频里的声音单独保存为音频文件(MP3/AAC/WAV/FLAC)用于配音、播客、听课或二次剪辑?本文挑出10款常用工具,给出实测可复现的操作步骤、优缺点和场景推荐。1)转换猫mp3转换器(操作门...
- 6个mp4格式转换器测评:转换速度与质量并存!
-
MP4视频格式具有兼容性强、视频画质高清、文件体积较小、支持多种编码等特点,适用于网络媒体传播。如果大家想要将非MP4格式的视频转换成MP4的视频格式的话,可以使用MP4格式转换器更换格式。本文分别从...