青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

step by step

 

散列3

  散列這是最后一章了,快畢業了,這幾天趕快把論文寫完,到回家還不到兩個月,答應張老師再去實驗室把做的東西總結一下,其實打算在實驗室再呆兩個月,臘月底再回,想寫的東西嘛,我想研究一下opencv的內存管理機制,結合我買的那本Applied C++,順便推銷一下這本書,這本書很薄,兩百多頁,介紹如何應用c++來解決開發商業軟件時所固有的問題,最難能可貴的是,從頭至尾提供了一個圖像處理框架,對于想在數字圖像處理,機器視覺方向深入探究(不是具體算法,而是整個軟件架構)有挺大的啟發意義的(雖然網上評價不是太好,可能比較牛的人看不上吧,也有可能這本書比較偏重于數字圖像領域),還想學的東西呢,年前和年后幾個月的時間Bjarne Stroustrup的那本c++,Mark Allen Weiss的那本數據結構,Jon Kleinberg 的那本算法設計,后兩本書是俺在圖像室的圖書角找到的,非常的不錯哦,可惜畢業前就要還,正好督促我趕緊看,在聯合書城看到Richard Johnsonbaugh的Discrete Mathematics,竟然是第七版了,只能怪我資質太差看不懂knuth的那三本圣經,只好咬著牙買下來先琢磨琢磨了算是打基礎了,公司有項目做嵌入式平臺上的編譯器,要是有時間的話看看嵌入式操作系統和編譯原理吧,很想寫個編譯器,這么多好書要看,有時候真不想回家過年了,嘿嘿,說著玩的,到時候家里肯定殺豬了,不回去真是太可惜了。

1.再散列
   其實就是前兩篇中有提到的rehash了,對于使用平方探測的開放定制散列法,如果表的元素填得太滿,那么操作的運行時間將開始消耗過長,且插入操作可能失敗。這可能發生在有太多刪除和插入混合的場合。此時,一個解決方法是建立另外一個大約兩倍大的表(而且使用一個相關的新散列函數),掃描整個原始散列表,計算每個(未刪除的)元素的新散列值并將其插入到新表中。整個操作成為再散列(rehashing)。這顯然是一種非常昂貴的操作;其運行時間為O(N),因為有N個元素要再散列而且表的大小約為2N,不過,因為不是經常發生,所以實際效果并沒有這么差。特別是,在最后的再散列之前已經存在N/2次插入,因此添加到每個插入上的花費基本是一個常數開銷。如果這種數據結構是程序的一部分,那么其影響是不明顯的。另一方面,如果再散列作為交互系統一部分運行,那么其插入引起再散列的用戶將會感到速度減慢。
    再散列可以用平方預測以多種方法實現。一種做法是只要表滿一半就再散列。另一種極端的方法是只有當插入失敗時才再散列。第三種方法即途中(middle-of-the-road)策略:當表到達某一個裝填因子時進行再散列。由于隨著裝填因子的增加,表的性能的確在下降,因此,以好的截至點實現的第三種策略,可能是最好的策略。
 1//對探測散列表和分離鏈接散列表的再散列
 2void rehash()
 3{
 4    vector<HashEntry> oldArray = array;
 5    array.resize( nextPrime( 2* oldArray.size() ) );
 6    forint j = 0; j<array.size(); j++ )
 7        array[j].info = EMPTY;
 8    currentSize = 0;
 9    forint i = 0; i<oldArray.size(); i++ )
10        if( oldArray[i].info == ACTIVE )
11            insert( oldArray[i].element );
12}

13
14void rehash()
15{
16    vector<list<HashedObj> > oldLists = theLists;
17    theLists.resize( nextPrime( 2* theLists.size() ) );
18    forint j = 0; j<theLists.size(); j++ )
19        theLists[j].clear();
20    currentSize = 0;
21    forint i = 0; i<oldLists.size(); i++ )
22    {
23        list<HashedObj>::iterator itr = OldLists[i].begin();
24        while ( itr != oldLists[i].end() )
25            insert( *itr++ );
26    }

27}


2.標準庫中的散列表
    標準庫中不包括set和map的散列表實現。但是,許多的編譯器提供具有與set和map類相同的成員函數的hash_set和hash_map.
    要使用hash_set和hash_map,就必須有相應的包含指令,而且,可能也需要相應的命名空間。這兩者都是和編譯器相關的。接下來還必須提供相應的類型參數來說明
hash_set和hash_map。對于hash_map,這些類型參數包括鍵的類型,值的類型,散列函數(返回無符號整數)和一個相等性操作符。遺憾的是,至于鍵和值的類型參數如何
表示還是編譯器相關的。
    下一次c++的較大的修訂將不可避免地包括這些hash_set和hash_map中的一個。

3.可擴散列
    最后討論數據量太大以至于裝不進主存的情況,此時主要考慮的是檢索數據所需的磁盤存取次數。假設在任意時刻都有N個記錄要存儲,N的值隨時間而變化。此外,最多可把M個記錄放入一個磁盤區塊,設M=4,如果使用探測散列或分離鏈接散列,那么主要的問題在于,即使是理想分布的散列表,在一次查找操作中,沖突也可能引起對多個區塊的訪問。不僅如此,當表變得過慢的時候,必須執行代價巨大的再散列這一步,它需要O(N)的磁盤訪問。
    一種聰明的選擇成為可擴散列(extendible hashing),它允許用兩次磁盤訪問執行一次查找。插入操作也需要很少的磁盤訪問.
   Extendible hashing from Wikipedia
   Extendible hashing
is a type of hash system which treats a hash as a bit string, and uses a trie for bucket lookup. Because of the hierarchal nature of the system, re-hashing is an incremental operation (done one bucket at a time, as needed). This means that time-sensitive applications are less affected by table growth than by standard full-table rehashes.

   

This is a more simplistic example from Fagin et al. (1979).

Assume that the hash function h(k) returns a binary number. The first i bits of each string will be used as indices to figure out where they will go in the "directory" (hash table). Additionally, i is the smallest number such that the first i bits of all keys are different.

Keys to be used:

h(k1) = 100100
h(k2) = 010110
h(k3) = 110110

Let's assume that for this particular example, the bucket size is 1. The first two keys to be inserted, k1 and k2, can be distinguished by the most significant bit, and would be inserted into the table as follows:

 directory
---------
|    0    |-----------> Bucket A (contains k2)
|---------|
|    1    |-----------> Bucket B (contains k1)
---------

Now, if k3 were to be hashed to the table, it wouldn't be enough to distinguish all three keys by one bit (because k3 and k1 have 1 as their leftmost bit. Also, because the bucket size is one, the table would overflow. Because comparing the first two most significant bits would give each key a unique location, the directory size is doubled as follows:

  directory
----------
|    00    |-----\
|----------|      ----------> Bucket A (contains k2)
|    01    |-----/
|----------|
|    10    |-----------> Bucket B (contains k1)
|----------|
|    11    |-----------> Bucket C (contains k3)
----------

And so now k1 and k3 have a unique location, being distinguished by the first two leftmost bits. Because k2 is in the top half of the table, both 00 and 01 point to it because there is no other key to compare to that begins with a 0.

4.小結
    散列表可以用來以常數平均時間實現insert和contains操作。當使用散列表時,注意諸如裝填因子這樣的細節是特別重要的,否則時間界將不再有效。當鍵不是短字符串或整數時,仔細選擇散列函數也是很重要的。
    對于分離鏈接散列法,雖然裝彈因子不大時性能并不明顯降低,但裝填因子還是應該接近于1,對于探測散列,除非完全不可避免,否則裝填因子不應該超過0.5,如果使用線性探測,那么性能隨著裝填因子接近于1而急速下降。再散列運算可以通過使表增長(或收縮)來實現,這樣可以保持合理的裝填因子。對于空間緊缺并且不可能聲明巨大散列表的情況,這是很重要的。
    二叉查找樹也可以用來實現insert和contains操作。雖然平均時間界為O(logN),但是二叉查找樹也支持那些需要排序的例程,從而功能更強大,使用散列表不可能找出最小元素。除非準確知道一個字符串,否則散列表也不可能有效地查找它。二叉查找樹可以迅速找到一定范圍內的所有項,散列表卻做不到。不僅如此,因為查找樹不需要乘法和除法,O(logN)這個時間界也不必比O(1)大那么多。
    另一方面,散列的最壞情形一般來自于實現錯誤,而有序的輸入卻可能使二叉樹運行得很差。平衡查找樹實現的代價相當高。因此,如果不需要排序的信息或者不確定輸入是否已經排序,那么就應該選擇散列這種數據結構。
    散列的應用很廣。編譯器使用散列表跟蹤源代碼中聲明的變量,這種數據結構叫做符號表(symbol table)。散列表時這種問題的理想選擇。標識符一般都不長,因此散列函數能夠迅速完成運算。此外,按字母順序排序變量通常也是不必要的。
    散列表適用于任何其節點有實名而不是數字名的圖論問題。這里,當輸入被讀入的時候,定點則按照它們出現的順序從1開始指定為一些整數。再有,輸入很可能有一組按字母順序排列的項。例如,頂點可以是計算機。此時,如果一個特定的計算中心把它的計算機列表成ibm1,ibm2,ibm3...那么,若使用查找樹則在效率方面很可能會有戲劇性的結果。
   散列表的第三種常見的用途實在為游戲編制的程序中。當程序搜索游戲的不同的運動路徑時,它通過計算基于位置的散列函數而跟蹤一些已知的位置(并把對于該位置的移動存儲起來)。如果同樣的位置再次出現,程序通常通過簡單的移動變換來避免昂貴的重復計算。游戲程序的這種一般特點叫做置換表(transposition table).
   散列的另一個用途是在線拼寫檢查程序。如果拼寫檢查程序的主要功能是檢查拼寫錯誤(而非糾正錯誤),那么可以預先將整個詞典進行散列,這樣就可以在常數時間內檢查單詞拼寫。散列表很適合這項工作,因為以字母順序排列單詞并不重要,而以它們在文件中出現的順序顯示錯誤拼寫當然也是可以接受的。

posted on 2009-11-27 17:14 小羅羅 閱讀(999) 評論(7)  編輯 收藏 引用

評論

# re: 散列3 2009-11-27 18:34 OwnWaterloo

研究opencv的內存管理? 如果是為了使用opencv,可以去研究。

如果是為了研究內存管理…… opencv的內存管理其實很磋……
當然,opencv可能只是為了開發一個足夠庫自身使用的內存管理與動態數據結構而已。就這個需求來說,opencv是達到了。


但"足夠庫自身使用"不一定就能滿足用戶的所有需求。
而opencv也不提供任何方法讓用戶擴展它的庫。
從這方面來說,opencv是相當的鼠目寸光。


比如opencv提供的CvCapture。其內部是有一個C實現的capture接口與capture工廠。
可是它不將接口定義暴露給用戶。
用戶需要自己的capture時怎么辦? 等著opencv去支持嗎? 那是不可能的。只能自己動手。
這個需求還好, 大不了讓自己的capture返回image(image or matrix),然后丟給opencv去處理就可以了。
image的格式opencv還算厚道,暴露出來了。
用戶如果想要實現得好一些,更capture無關,就需要自己再抽象一個capture接口,然后將opencv的capture包含進去 —— 基本就是將CvCapture的代碼再實現一遍 —— 因為那短視的opencv沒將這個可擴展點暴露出來。



如果用戶不滿意CvMemStorage和CvSeq的行為,哼哼……
必須屈服,除非用戶想自己重寫opencv —— 換句話說,就是放棄opencv。

CvMemStorage實現的是一個"多次取、整體放"的策略。
所有的動態數據結構都將數據存放在CvMemStorage分配的內存上。
沒有單獨釋放數據結構中某個元素的方式,只能釋放整個Storage。
可是opencv沒有定義出一個接口,作為CvMemStorage和CvSeq之間的中間層,而是CvSeq直接使用CvMemStorage。

CvMemStorage本身也不咋嘀。甚至還有一個單次分配大小的上限……

一句話,opencv需要輸出動態數據結構的算法和CvSeq綁死了,CvSeq又和CvMemStorage綁死了,而CvMemStorage又實現得不咋嘀……
你要使用opencv嗎?請忍受CvMemStorage……
相比CvCapture可以繞過去;這個問題幾乎無解。

  回復  更多評論   

# re: 散列3 2009-11-27 20:41 小羅羅

@OwnWaterloo
謝謝您指點,因為我以前只是用過opencv里的函數,從沒有關心它的實現,我的打算是通過學習它的內存機制來加深對它內部結構的了解,并且我現在還在用一個叫mil的庫,它不是開源的,相比較而言,我就選擇opencv來學習,不管怎樣,我覺得opencv還是值得我現在的水平拿來學習的,只有真正學過了,才有資格評論,是吧?  回復  更多評論   

# re: 散列3 2009-11-27 20:56 OwnWaterloo

@小羅羅
只看源碼很枯燥,而且有些細節很難理解。
看這本書吧:《C語言接口與實現:創建可重用軟件的技術》
http://www.china-pub.com/14974

里面的arena,思想和CvMemStorage是一樣的"零取整放"。
CvMemStorage比arena多一些功能。

書里將arena的同時,會把內存分配器的一些細節說清楚,這些可能是看源代碼多遍都看不出來的。
反正arena章節也不多……

  回復  更多評論   

# re: 散列3 2009-11-27 23:44 小羅羅

看了簡介,很不錯的樣子,好的,聽你的,豁出去了,買了  回復  更多評論   

# re: 散列3 2009-11-27 23:50 OwnWaterloo

@小羅羅
這…… 那鏈接上不是說已經絕版了嗎?
  回復  更多評論   

# re: 散列3 2009-11-27 23:52 OwnWaterloo

http://download.csdn.net/source/747860

掃描版的,湊合著看吧……
源代碼在這里:
http://code.google.com/p/cii/downloads/list

  回復  更多評論   

# re: 散列3 2009-11-28 00:00 小羅羅

OwnWaterloo ,我下載下來了,現在開始看。


  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

統計

常用鏈接

留言簿

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久综合九色九九| 欧美精品在线观看一区二区| 亚洲欧美另类在线| 女仆av观看一区| 久久久久久综合| 在线观看亚洲视频啊啊啊啊| 蜜臀久久99精品久久久画质超高清| 欧美一级专区免费大片| 国产综合久久久久久鬼色| 久久夜色精品国产亚洲aⅴ| 久久久久久网址| 亚洲精品1区2区| 亚洲最新色图| 国产欧美精品久久| 欧美成人国产| 欧美精品亚洲二区| 欧美亚洲一区二区在线| 久久国产精品电影| 亚洲啪啪91| 一区二区三区回区在观看免费视频| 国产精品久久久| 蜜桃av综合| 欧美三级在线视频| 久久精品视频99| 欧美国产精品| 欧美在线资源| 欧美国产精品va在线观看| 在线视频亚洲| 久久国产精品第一页| 一区二区三区欧美亚洲| 亚欧成人精品| 99热在这里有精品免费| 欧美一区二区日韩| 一本到高清视频免费精品| 欧美一级淫片播放口| 日韩一二三区视频| 欧美在线免费观看视频| 一区二区三区四区国产| 久久精品系列| 亚洲欧美欧美一区二区三区| 久久久久久综合| 亚洲欧美日韩一区二区在线| 欧美va日韩va| 久久亚洲综合色| 欧美视频三区在线播放| 欧美激情一区二区三区在线| 国产精品自拍小视频| 亚洲精品中文在线| 亚洲国产激情| 欧美一区二区三区精品电影| 亚洲视频中文| 欧美成人精品影院| 蜜桃av噜噜一区二区三区| 国产美女扒开尿口久久久| 一区二区电影免费在线观看| 亚洲日本免费| 猛男gaygay欧美视频| 久久人人97超碰国产公开结果| 国产精品久久久久免费a∨| 亚洲精品1区2区| 亚洲国产色一区| 久热精品视频在线免费观看| 久久午夜精品一区二区| 国产亚洲欧美另类一区二区三区| 中文网丁香综合网| 亚洲欧美另类久久久精品2019| 欧美日韩亚洲高清一区二区| 亚洲国产视频直播| 91久久久一线二线三线品牌| 欧美69视频| 亚洲国产裸拍裸体视频在线观看乱了| 国产一区二区三区无遮挡| 午夜精品久久久久久久久久久| 亚洲欧美日本国产有色| 国产精品毛片一区二区三区| 一区二区三区四区蜜桃| 亚洲一二三区在线| 国产精品久久久999| 亚洲尤物视频网| 久久精品国产清高在天天线 | 一本久道久久久| 亚洲视频免费| 国产精品色在线| 欧美一区成人| 免费亚洲视频| 99国产精品一区| 欧美精品亚洲二区| 亚洲一区二区三区四区五区黄 | 亚洲毛片在线观看.| 欧美日韩国产在线播放网站| 亚洲一区二区欧美日韩| 久久精品二区三区| 亚洲第一区在线| 欧美精品一区二区三区很污很色的| 99国产一区二区三精品乱码| 欧美一区二区精品在线| 激情综合色综合久久| 欧美高清视频| 亚洲一区二区不卡免费| 美女黄网久久| 亚洲一区二区三区精品在线观看| 国产农村妇女精品| 美女在线一区二区| 亚洲一区二区伦理| 欧美大秀在线观看| 亚洲欧美视频一区二区三区| 一区二区亚洲精品| 欧美午夜a级限制福利片| 久久久精品一区二区三区| 亚洲欧洲精品一区二区三区 | 亚洲高清毛片| 国产精品国产三级国产普通话三级| 欧美一区激情| 亚洲精品系列| 免费亚洲一区| 欧美一区二区在线免费播放| 亚洲日韩视频| 国产亚洲精品激情久久| 欧美日韩国产不卡| 久久久久久一区二区| 亚洲中午字幕| 亚洲欧洲午夜| 麻豆成人精品| 性做久久久久久| 一本色道久久精品| 在线观看一区欧美| 国产午夜精品麻豆| 国产精品久久久久久久久久三级| 免费在线日韩av| 久久精品一区四区| 亚洲欧美视频在线观看视频| 日韩亚洲欧美成人| 亚洲精品免费一区二区三区| 蜜桃av一区二区三区| 久久精品99国产精品日本| 亚洲欧美韩国| 亚洲一区二区三| 亚洲网站在线看| 一区二区精品国产| 亚洲精品在线视频观看| 亚洲黄页视频免费观看| 亚洲第一精品久久忘忧草社区| 国产亚洲成年网址在线观看| 国产精品午夜在线观看| 国产精品视频免费| 国产精品一区在线观看你懂的| 欧美午夜精品久久久久久孕妇| 欧美日韩精品免费观看| 欧美日韩美女| 欧美日韩中文精品| 国产精品久久久久久久浪潮网站 | 欧美成人一区在线| 欧美激情第六页| 欧美激情一区二区三区成人| 欧美精品videossex性护士| 欧美国产视频日韩| 欧美激情按摩在线| 欧美日韩在线观看视频| 国产精品乱子久久久久| 国产精品女主播一区二区三区| 国产精品久久毛片a| 国产欧美日韩一区二区三区| 国产欧美一区二区精品性| 国产一区二区无遮挡| 在线电影一区| 亚洲毛片在线看| 亚洲你懂的在线视频| 久久久水蜜桃av免费网站| 你懂的视频欧美| 亚洲精品国产精品国产自| 一区二区三区精品在线| 欧美一区亚洲一区| 裸体丰满少妇做受久久99精品| 欧美成人资源网| 国产精品久久久久久一区二区三区| 国产亚洲欧美一区二区| 亚洲国产精品久久久久秋霞蜜臀| 日韩视频一区| 久久成人资源| 欧美大色视频| 亚洲视频精选| 久久艳片www.17c.com| 欧美日本不卡| 国产真实乱偷精品视频免| 亚洲精品乱码久久久久久蜜桃91| 亚洲欧美日韩精品久久奇米色影视 | 欧美日韩国产亚洲一区| 国产女人精品视频| 亚洲精品日韩一| 久久精品国内一区二区三区| 亚洲第一综合天堂另类专| 亚洲亚洲精品在线观看| 蜜臀va亚洲va欧美va天堂 | 久久久999成人| 欧美三级电影大全| 亚洲高清资源| 久久激情五月丁香伊人| 99热精品在线观看| 久久免费视频在线观看| 国产精品亚洲аv天堂网|