V 語言 資料結構 Map

2021-09-24 22:00:00 字數 1549 閱讀 8581

v語言現在還在開發階段,所以還有很多不成熟的地方。比如其中的map,還只是乙個原型。下面我做乙個簡單的分析。

module builtin

struct

mapstruct entry

可以看到,map的結構十分簡單,只包含三個成員

其中的is_sorted這個屬性比較有意思,說明在方法裡面會排序,用到排序則很有可能與提高查詢效率有關。

下面再來看方法。

對於乙個map來說,用的最多的無非是插入元素和獲取元素。

// 插入乙個元素

fn (m mut map

)_set

(key string

, val voidptr)

m.entries[i]

= e return}}

m.entries << e// m.new_entry(key, val)

m.is_sorted =

false

}

插入元素的過程可以描述為:

建立乙個元素

遍歷查詢鍵是否重複

如果重複,則賦值

如果沒重複,則新增到末尾

不難看出,插入用到了遍歷,其時間複雜度為o(n),是一種很低效的演算法。在後續有很大的優化空間。

// 獲取元素

fn (m map

)get

(key string

, out voidptr)

bool

for i :=

0; i < m.entries.

len; i++

}return

false

}// 二分查詢

fn (m map)bs

(query string

, start, end int

, out voidptr)

if end - start ==

1if mid >= m.entries.

len mid_msg := m.entries[mid]

// println('mid.key=$mid_msg.key')

if query < mid_msg.key

m.bs

(query, mid, end, out)

}

查詢的流程可以描述為:

查詢過程用到了二分查詢(o(lgn)),和遍歷(o(n)),但是大部分時候,開發者不會對map顯式排序,所以真正起作用的是遍歷操作,也是十分低效。

map模組顯然很不成熟,其結構和演算法有很大改進空間。

如果採用陣列作為儲存容器,則至少也可以達到查詢: o(lgn) -> 排序o(lgn) + 二分查詢 o(lgn), 插入o(lgn) -> 查重o(lgn) + 插入o(1)。否則資料量稍大會非常慢。

如果採用hash實現,則可達到o(1) + o(1)的速度,不過這要看v語言的開發者如何取捨。

v語言當前還無法用於生產環境,嘗鮮可以,但正式環境還不可用。其語言特性很有吸引力,但現在的完成度還不高,到穩定可用估計還需要些時日。

Map與資料結構

上篇中介紹了collection中arraylist和linkedlist和在資料結構中的分析。但在,由於collection是無論是基於陣列的arraylist還是基於鍊錶的linkedlist它都沒有辦法儲存有關係的資料,比如乙個人的姓名 身份證,這樣有關係的資料。因此就有了map介面。arra...

資料結構 map的學習

main.cpp map使用 created by 劉鑫偉 on 14 7 25.include include includeusing namespace std int main 清空map中的資料可以用clear 函式,判定map中是否有資料可以用empty 函式,它返回true則說明是空m...

Python實現Map資料結構

class hashtable def init self 初始化兩個list,乙個用來儲存鍵值,乙個用來儲存值 self.size 11 self.slots none self.size self.data none self.size 定義hash函式,使用餘數法 def hashfuncti...