哈希表的簡(jiǎn)單實(shí)現(xiàn)和存取時(shí)間實(shí)驗(yàn)

今天看了哈希表原理姻氨,理解了個(gè)大概:

python 的 字典是基于哈希表實(shí)現(xiàn)的,之所以字典的存取操作的時(shí)間復(fù)雜度為O1也得益于哈希表穆壕。
我們知道,數(shù)組的時(shí)間復(fù)雜度為O1其屏,是因?yàn)閿?shù)組實(shí)現(xiàn)了以索引存取值喇勋,這樣在存取數(shù)據(jù)的時(shí)候,只需要
將索引(內(nèi)存地址)拿到偎行,就能很快地將數(shù)據(jù)進(jìn)行存取操作川背,一步到位。當(dāng)然插入和刪除因?yàn)橐婕叭吭?所以時(shí)間復(fù)雜度是另一個(gè)級(jí)別蛤袒。

而字典熄云,其實(shí)就是一個(gè)變相的數(shù)組。它將我們要存儲(chǔ)的字符串先轉(zhuǎn)化為 數(shù)字 索引妙真,然后再存到列表里缴允。
這里 可以想象,由于同樣的字符串轉(zhuǎn)化為數(shù)字索引的時(shí)候(如果是用同一種算法)珍德,可定會(huì)發(fā)生重復(fù)练般,即
碰撞。這里不寫(xiě)解決碰撞的方法锈候,本例中 思路是將每個(gè)字符串存進(jìn)表的時(shí)候薄料,掛上一個(gè)獨(dú)一無(wú)二的id。

talk is cheap晴及,代碼實(shí)現(xiàn)如下:

import random
import time


class Hastable(object):
    def __init__(self):
        self.table_size = 100007
        self.table = [0] * self.table_size

    def add(self, key, value):
        index = 1
        f = 1
        for s in key:
            index += ord(s) * f
            f *= 10
        index = index % self.table_size

        data = [key, value]
        if self.table[index] == 0:
            self.table[index] = [data]
        else:
            self.table[index].append(data)

    def get(self, key, defult=None):
        index = 1
        f = 1
        for k in key:
            index += ord(k) * f
            f *= 10
        index = index % self.table_size

        if isinstance(self.table[index], list):
            for ls in self.table[index]:
                if ls[0] == key:
                    return ls[1]
        else:
            return defult


# -----------------以下為測(cè)試時(shí)間-----------

ls = []


def ran():
    seed = 'abcdefghijklmnopqrstuvwxyz'
    s = ''
    for i in range(5):
        random_index = random.randint(0, len(seed) - 1)
        s += seed[random_index]
    ls.append(s)


def ye(n):
    i = 0
    while i < n:
        ran()
        i += 1


def test():
    import uuid
    t1 = time.time()
    print('list add start', t1)
    ye(500000)
    t2 = time.time()
    print('list add end', t2)
    print('total time', t2 - t1)

    print("=====================")

    t3 = time.time()
    print('Hastable add start', t3)
    ht = Hastable()
    for key in ls:
        value = uuid.uuid4()
        # print('value', value)
        ht.add(key, value)
    t4 = time.time()
    print('Hastable add total', t4 - t3)

    print("=====================")

    t5 = time.time()
    print('Hastable get start', t5)
    for key in ls:
        v = ht.get(key)
    t6 = time.time()
    print('Hastable get total', t6 - t5)

    print("=====================")

    t7 = time.time()
    print('list get start', t7)
    for i in range(len(ls)):
        ls.__getitem__(i)
    t8 = time.time()
    print('list get total', t8 - t7)

    print('all time', t8 - t1)

if __name__ == '__main__':
    test()

輸出如下:

list add start 1527833095.2639012
list add end 1527833102.5443177
total time 7.280416488647461
=====================
Hastable add start 1527833102.5443177
Hastable add total 6.015344142913818
=====================
Hastable get start 1527833108.5596619
Hastable get total 1.8111035823822021
=====================
list get start 1527833110.3707654
list get total 0.07000398635864258
all time 15.176868200302124
[Finished in 15.7s]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嫡锌,隨后出現(xiàn)的幾起案子虑稼,更是在濱河造成了極大的恐慌,老刑警劉巖势木,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛛倦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡啦桌,警方通過(guò)查閱死者的電腦和手機(jī)溯壶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)及皂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人且改,你說(shuō)我怎么就攤上這事验烧。” “怎么了又跛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵碍拆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我慨蓝,道長(zhǎng)感混,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任礼烈,我火速辦了婚禮弧满,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘此熬。我一直安慰自己庭呜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布摹迷。 她就那樣靜靜地躺著疟赊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峡碉。 梳的紋絲不亂的頭發(fā)上近哟,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音鲫寄,去河邊找鬼吉执。 笑死,一個(gè)胖子當(dāng)著我的面吹牛地来,可吹牛的內(nèi)容都是我干的戳玫。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼未斑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咕宿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蜡秽,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤府阀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后芽突,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體试浙,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年寞蚌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了田巴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钠糊。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖壹哺,靈堂內(nèi)的尸體忽然破棺而出抄伍,到底是詐尸還是另有隱情,我是刑警寧澤斗躏,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布逝慧,位于F島的核電站,受9級(jí)特大地震影響啄糙,放射性物質(zhì)發(fā)生泄漏笛臣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一隧饼、第九天 我趴在偏房一處隱蔽的房頂上張望沈堡。 院中可真熱鬧,春花似錦燕雁、人聲如沸诞丽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)僧免。三九已至,卻和暖如春捏浊,著一層夾襖步出監(jiān)牢的瞬間懂衩,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工金踪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浊洞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓胡岔,卻偏偏與公主長(zhǎng)得像法希,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子靶瘸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,316評(píng)論 25 707
  • 如果不是因?yàn)橐粓?chǎng)分享苫亦,我大概不會(huì)認(rèn)真的寫(xiě)寫(xiě)影評(píng)。 可能很多人對(duì)于懸疑片怨咪,更喜歡英劇美劇或者好萊塢大片屋剑,尤其是那種劇...
    陳陳陳詞濫調(diào)閱讀 715評(píng)論 3 6
  • 引言 記錄工作中常用到的Linux指令,不斷更新惊暴。 1饼丘、man man命令是Linux下的幫助指令趁桃,通過(guò)man指令...
    斯文遮陽(yáng)閱讀 230評(píng)論 0 2
  • 迄今為止辽话,我認(rèn)為人生是有兩次最漫長(zhǎng)的告別的肄鸽。一次是告別生死,一次是告別成長(zhǎng)油啤,這兩次又包含著多次典徘。漫長(zhǎng)到你可以聽(tīng)見(jiàn)骨...
    喬艾一閱讀 775評(píng)論 0 0