Ⅰ LUA 關於取出兩個table中不同元素的演算法。
【我理解下你的意思
你是要把 T_letter_tbl 中所有元素的 letter標簽和 和 hope_letter_tbl 中的元素比較,如果 發現重復 的 則刪除 T_letter_tbl 中的 重復標簽嗎?
【一般做法】用 lua 做這種很容易,但是要注意方法,不是比較,那樣遍歷比較 效率太低。先把 需要比較的 table 的元素作為 索引 建立一個 hash
直接取元素 進行 標簽判斷,
下面是一個演示:table.print 自定義的輸出,可以刪去,自己選擇輸出方式
functiontable.print(tbl,name)
name=nameor"table"
localprompt=''
locali=1
localprinted={}
localfunctiontostring2(var)
if(type(var)=="string")then
return'"'..var..'"'
end
returntostring(var)
end
localfunctionitor(t,i)
printed[tostring(t)]=true;
forkey,eleinpairs(t)do
ifnot(type(ele)=="table")then
print(string.format('%s[%s]=%s;',string.rep(prompt,i),tostring2(key),tostring2(ele)))
elseifprinted[tostring(ele)]then
print(string.format('%s[%s]=%s;',string.rep(prompt,i),tostring2(key),tostring2(ele)))
else
print(string.format('%s[%s]={',string.rep(prompt,i),tostring2(key)))
i=i+1
itor(ele,i)
i=i-1
print(string.format('%s};',string.rep(prompt,i)))
end
end
end
print(string.format("%s={",name))
itor(tbl,i)
print("};")
end
-----------------------------------------------------
tbl_letter_HOPE={
[1]="bbbbbb";
[2]="ffffff";
[3]="cccccc";
[4]="xxxxxx";
[5]="eeeeee";
};
tbl_letter_T={
[1]={["letter"]="Y"};
[2]={["letter"]="M"};
[3]={["letter"]="P"};
[4]={["letter"]="K"};
[5]={["letter"]="bbbbbb"};
[6]={["letter"]="R"};
[7]={["letter"]="Q"};
[8]={["letter"]="xxxxxx"};
[9]={["letter"]="L"};
[10]={["letter"]="D"};
[11]={["letter"]="B"};
[12]={["letter"]="ffffff"};
[13]={["letter"]="Z"};
[14]={["letter"]="T"};
[15]={["letter"]="["};
[16]={["letter"]="cccccc"};
[17]={["letter"]="E"};
[18]={["letter"]="C"};
[19]={["letter"]="W"};
[20]={["letter"]="I"};
[21]={["letter"]="F"};
[22]={["letter"]="eeeeee"};
[23]={["letter"]="O"};
[24]={["letter"]="X"};
[25]={["letter"]="U"};
[26]={["letter"]="S"};
};
---根據tbl_letter_HOPE中的元素去除tbl_letter_T中的元素
--
localfunctionmain()
localtbl_erase={}
forkey,eleinpairs(tbl_letter_HOPE)do
--不考慮元素權重則改為=true
tbl_erase[tostring(ele)]=(tbl_erase[tostring(ele)]or0)+1
end
forkey,eleinpairs(tbl_letter_T)do
iftbl_erase[ele.letter]then
--移除整行[12]={["letter"]="ffffff"};
tbl_letter_T[key]=nil
--還是一個標簽letter
--tbl_letter_T[key].letter=nil
end
end
table.print(tbl_letter_T)
end
startTime=os.time()
main()
print(string.format(">>Thisfunctioncost:%sms",tostring(os.time()-startTime)))
【附】
如果只想 獲得去除給定元素後的 table
可以先 復制原 tbl_letter_T
注意:
不要用 淺復制 你之前 那個代碼 可能 就是 希望做一個 tbl_letter_T 的副本
但是 使用 淺復制相當於僅復制了指向table的句柄。
php">tbl_Interim=tbl_letter_T--2個變數指向同一個table表
要用
python">forkey,eleinpairs(tbl_letter_T)do
tbl_Interim[key]=ele
end
Ⅱ 哈希表map和table哪個性能高
list支持快速的插入和刪除,但是查找費時;
vector支持快速的查找,但是插入費時。
map查找的時間復雜度是對數的,這幾乎是最快的,hash也是對數的。
如果我自己寫,我也會用二叉檢索樹,它在大部分情況下可以保證對數復雜度,最壞情況是常數復雜度,而std::map在任何情況下都可以保證對數復雜度,原因是它保證存諸結構是完全二叉檢索樹,但這會在存諸上犧牲一些時間。
STL 中的 map 內部是平衡二叉樹,所以平衡二叉樹的性質都具備。查找數據的時間也是對數時間。 vector,在分配內存上一般要比 new 高效的多。
為什麼說 hash_map 是對數級的?在不碰撞的情況下,hash_map是所有數據結構中查找最快的,它是常數級的。
如果對問題設計了足夠好的hash演算法,保證碰撞率很低,hash_map的查找效率無可置疑。
另外,STL的map,它的查找是對數級的,是除hash_map外最高的了,你可以說「也許還有改進餘地」,但對於99.9999%的程序員,設計一個比STL map好的map,我執悲觀態度。
STL的map有平衡策略(比如紅黑樹什麼的),所以不會退化,不需要考慮數據本身的分布問題。只不過,如果數據本身是排好序的,用vector或heap會明顯的快些,因為它們的訪問比較簡單。
我想沒必要懷疑stl::map的查找效率,影響效率最主要的因素是什麼?演算法,在查找問題上,有什麼演算法比RB_tree更好嗎?至少現在還沒有。不否 認你可以通過自己寫代碼,設計一個符合你需要的BR—TREE,比stl::map簡捷那麼一點,但最多也就每次迭代中少一行指令而已,處理十萬個數據多 執行十萬行指令,這對你重要嗎?如果你不是在設計OS像Linux,沒人會關注這十萬行指令花的時間。
rb-tree的時間花在了插入和刪除上,如果你不是對插入和刪除效率要求很高,你沒有理由不選擇基於rb-tree的stl::map。
大多數程序員寫不出比std::map更好的map,這是當然的。然而並不是std::map的所有特性都出現在我們的程序中,自己編寫的可以更適合自己的程序,的確會比std::map更快一些。
關於hash_map,它與map的實現機制是不一樣的,map內部一般用樹來實現,其查找操作是O(logN)的,這個沒有爭議,我就不多說了。
hash_map的查找,內部是通過一個從key到value的運算函數來實現的,這個函數「只接受key作為參數」,也就是說,hash_map的查找 演算法與數據量無關,所以認為它是O(1)級的。來這里的應該都是達人,可以參看《數據結構》。當然,事實總不這樣完美,再引一段前面我自已說的話,進一步 說明,以免誤會:
-----------------------------------------
在不碰撞的情況下,hash_map是所有數據結構中查找最快的,它是常數級的。
------------------------------------------
注意我的前提:「在不碰撞的情況下」,其實換句話說,就是要有足夠好的hash函數,它要能使key到value的映射足夠均勻,否則,在最壞的情況下,它的計算量就退化到O(N)級,變成和鏈表一樣。
如果說 hash_map 是所有容器中最慢的,也只能說:「最拙劣的hash函數」會使hash_map成為查找最慢的容器。但這樣說意義不大,因為,最湊巧的排列能使冒泡排序成為最快的排序演算法。
BS: "對於大型容器而言,hash_map能夠提供比map快5至10倍的元素查找速度是很常見的,尤其是在查找速度特別重要的地方.另一方面,如果hash_map選擇了病態的散列函數,他也可能比map慢得多. "
ANSIC++在1998年之後就沒再有重大改變,並且決定不再向C++標准庫中做任何重大的變更,正是這個原因,hash table(包括hash_map)並沒有被列入標准之中,雖然它理應在C++標准之中佔有一席之地。
雖然,現在的大多數編譯平台支持hash table,但從可移植性方面考慮,還是不用hash table的好。
hehe俺也來湊湊熱鬧。
1.有的時候vector可以替代map
比如key是整數,就可以以key的跨度作為長度來定義vector。
數據規模很大的時候,差異是驚人的。當然,空間浪費往往也驚人。
2.hash是很難的東西
沒有高效低碰撞的演算法,hash_xxx沒有意義。
而對不同的類型,數據集,不可能有優良的神仙演算法。必須因場合而宜。
俺有的解決方法是GP,可不是飯型,是遺傳編程,收效不錯。
你的百萬級的數據放到vector不大合適。因為vector需要連續的內存空間,顯然在初始化這個容器的時候會花費很大的容量。
使用map,你想好了要為其建立一個主鍵嗎?如果沒有這樣的需求,為什麼不考慮deque或者list?
map默認使用的是deque作為容器。其實map不是容器,拿它與容器比較意義不大。因為你可以配置它的底層容器類型。
如果內存不是考慮的問題。用vector比map好。map每插入一個數據,都要排序一次。所以速度反不及先安插所有元素,再進行排序。
用 binary_search對已序區間搜索,如果是隨機存取iterator,則是對數復雜度。可見,在不考慮內存問題的情況下,vector比map 好。
如果你需要在數據中間進行插入,list 是最好的選擇,vector 的插入效率會讓你痛苦得想死。
涉及到查找的話用map比較好,因為map的內部數據結構用rb-tree實現,而用vector你只能用線性查找,效率很低。
stl還提供了 hash容器,理論上查找是飛快~~~。做有序插入的話vector是噩夢,map則保證肯定是按key排序的,list要自己做些事情。
HASH類型的查找肯定快,是映射關系嘛,但是插入和刪除卻慢,要做移動操作, LIST類型的使鏈式關系,插入非常快,但是查找卻費時,需要遍歷~~ , 還是用LIST類型的吧,雖然查找慢點,
先快速排序,然後二分查找,效率也不低
Ⅲ 請問Lua語言中table.sort底層使用的是哪種排序演算法
根據 lua 的 wiki,table.sort 採用的是基於 quicksort 的排序演算法。
Ⅳ C#,關於DataTable的一個遞歸演算法
給你一個思路吧,先通過給出的這個ID,獲得這條記錄,然後判斷這條記錄的pid是否為-1等之類的值,如果是,表明沒有父類,如果有,再通過這個pid調用這個函數一次,以此類推,得出遞歸演算法!
Ⅳ 求lua中根據table的鍵值取出相應數據的演算法。
local testTabel = {
a = "testSuccessed",
b = 1,
c = 2
}
function GetNodeWithKey(t, k)
return t[k]
end
local data = GetNodeWithKey(testTabel,"a")
print(data)
Ⅵ hashtable和hashmap 演算法的區別
HashMap不是線程安全的
hastmap是一個介面 是map介面的子介面,是將鍵映射到值的對象,其中鍵和值都是對象,並且不能包含重復鍵,但可以包含重復值。HashMap允許null key和null value,而hashtable不允許。
2 HashTable是線程安全的一個Collection。
HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map介面,主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,效率上可能高於Hashtable。 HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。 Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。 Hashtable和HashMap採用的hash/rehash演算法都大概一樣,所以性能不會有很大的差