GO地图介绍
Go的映射是无序的键-值对的集合。 Map最重要的一点是用key快速搜索数据。 key就像索引,指向数据的值。 Map是一种集合,因此可以重复数组和切片。 但是,映射是无序的,无法决定返回的顺序。 这是因为Map是使用链式混列表实现的。
在c中实现
在C STL中,映射用红黑树实现,可以实现有序的映射。
通过Go实现
实现原理
这种实现方法的主要方法是交换空间和时间。 list和map两种类型的数据结构,存储同一数据。 list用于顺序扫描,map用于检索、删除操作
实现代码
包主
导入(
' container/list '
' fmt '
)
类型密钥接口{
GetKey ()字符串
}
类型映射结构{
datamapmap [字符串] * list.element
dataList *list.List
}
funcnewmaplist(*maplist{
返回映射{
data map : make (map [字符串] * list.element )、
dataList: list.New ()、
}
}
func(maplist*maplist ) exists (数据密钥) bool {
_,exists :=maplist.data map [ string (data.getkey ()
返回退出
}
func(maplist*maplist ) push (数据密钥) bool {
ifmaplist.exists(data ) {
返回假
}
elem :=maplist.datalist.push back (data )
maplist.data map [ data.getkey ()=elem
返回真
}
maplist * maplist (func ) remove (数据密钥)
if! maplist.exists(data ) {
返回
}
maplist.datalist.remove (maplist.data map [ data.getkey ()
Delete(maplist.datamap,data.GetKey ) )
}
func(maplist*maplist ) Size ) int {
return mapList.dataList.Len (
}
func(maplist*maplist ) walk (CB func (数据密钥) )
for elem :=maplist.datalist.front (; 雷姆!=nil; elem=elem.Next (
CB(Elem.value.(Keyer ) ) ) ) ) ) )。
}
}
类型元素结构{
值字符串
}
func(eelements ) GetKey ) ) string {
return e.value
}
func main () }
fmt.println (开始测试. ) )。
ml :=新maplist (
var a,b,c Keyer
a=Elements{'sxdhm'}
b=Elements{'Bob'}
c=Elements{'Conrad'}
是ml.push(a )
是ml.push(b )
是ml.push(c )
CB :=func (数据密钥) {
fmt.println (ml.data map [ data.getkey ().value.(* elements ).value
}
fmt.println (printelementsintheorderofpushing : ) )。
是ml.walk(CB )
fmt.printf (sizeof maplist : % d (n ),ml.Size ) )
是ml.remove(b )
fmt.println (afterremovingb : ) )。
是ml.walk(CB )
fmt.printf (sizeof maplist : % d (n ),ml.Size ) )
}
好处
插入、删除、检索红黑树的复杂度都是o(logn ),而该实现的插入、检索、删除复杂度都是o (o ) 1,可以说是非常好的数据结构。
缺点
因为使用了两个数据结构,所以空间稍微变大了。 但是,与树的实现相比,这种占有也不是很大