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...