2013-05-16 30 views
3

我正試圖解釋Map(又名哈希表,dict)給剛剛接觸編程的人。儘管Array(=事物列表)和Set(每件事物)的概念對每個人都很熟悉,但我很難找到Maps的真實世界隱喻(我特別感興趣的是python dicts和Javascript Objects)。經常使用的字典/電話簿比喻不正確,因爲詞典排序,而地圖不是 - 這一點對我很重要。 所以問題是:什麼是現實世界中的現象或設備,其行爲就像計算機中的Map一樣?在現實世界中的地圖(哈希表)

+0

'SortedMap'是按Java排序的,我想!!!! – NINCOMPOOP

+0

你爲什麼要使用地圖的唯一原因是鍵值對的數組列表是因爲快速查找,這就是爲什麼你無法解釋它的原因(它沒有做一個完全不同的任務,它只是一個優化)。討論地圖是毫無意義的,除非你討論爲什麼地圖存在。 – Patashu

+0

我剛剛意識到「字典/電話簿的比喻」也沒有意義上的真實世界的模擬!你問這個快樂! –

回答

3

我同意德爾南的看法,人類的例子可能太接近於一個物體。如果您試圖轉換爲解釋如何在鬆散類型的語言中實現對象,那麼這很適用,但是映射也是一種存在於Java和C#中的概念。如果他們開始使用這些語言,這可能會非常混亂。

基本上你要明白,地圖是依靠獨特的設定值作爲鍵的即時查詢窗口。這兩件事情確實需要特別強調的,所以這裏是一個體面而高度人爲的例子:

比方說你有一個聚會,每個人都爲我們帶來的一件事。爲了幫助組織者,每個人都說他們的名字是什麼,他們帶來了什麼。現在讓我們假裝有兩種方法來存儲這些信息。第一個是把它放在一個清單上,第二個是告訴別人一個教學記憶。人爲的部分是,他們只能通過你的名字來識別你(所以他是盲人,並有人工耳蝸,所以每個人都聽起來像一個機器人,最好我可以拿出來)。

列表:要添加,你只是追加到列表的底部。要退出,只需從列表中刪除自己。如果你想看看誰帶來了什麼,他們帶來了什麼,那麼你必須掃描整個列表,直到你找到它們。如果在掃描後沒有找到它們,那麼它們顯然不在列表中,也不會帶來任何東西。該清單顯然會允許具有相同名字的人重複。

詞典(做作的人):你不追加到列表的末尾,你只要告訴他一個人的名字,以及他們帶來。如果你想知道某人給你帶來的是什麼,只要問問他的名字,他會立即告訴你。同樣,如果兩個同名的人告訴他他們帶來了什麼,他會認爲它是同一個人,只是改變他們帶來的東西。如果有人沒有註冊,你會按名稱詢問,但他會困惑並問你你在說什麼。當你告訴那個人某人不再帶來某些東西時,你會不得不說,他會失去他們所有的記憶,所以是非常人爲的。

您可能還需要說明爲什麼該列表是足夠的,如果你不關心誰帶來什麼,而只需要知道什麼都將被帶入。也許甚至可以將名字從名單中刪除,以便用字典強調鍵/值對。

+0

這很有道理。感謝您的回答,並歡迎來到StackOverflow! – georg

1

我曾經見過的人的大名單,根據他們的標識號的他們最後N個數字進行分級的情況下,爲了節省鍵搜索。這種分類有點類似哈希,並可能有助於解釋它。

2

也許這將是一個人,你的第一次會議的比喻:

每個人都有屬性的無序量,每個屬性只能有1個值,它是獨一無二的(如hair=longeye_color=blue)。你會發現這些屬性沒有特定的順序。

所以對她一個人可以有一個shoesize=38hair_color=browneye_color=blue和背誦(human_dict.get('shoe_size')),這樣,一個人的時候否則你就別說沒有特定的順序屬性除非屬性名。

+0

-1這更像是一個記錄,其中密鑰集是已知的(有點)不變,而且值是異構的。一旦他們知道許多使用哈希表的動態語言實現對象,人們就很容易將地圖和對象混爲一談,不需要加強混淆。 – delnan

1

你是否成功地以邏輯的方式解釋數組.. ..這個數組是一個存儲元素保存在第一個位置的存儲。第二位置,第三位置....第一,second.third基本上都是鍵...

現在擴展它說地圖是存儲在哪裏鍵不一定numbers..lets說他們是串...或偶數不連續或沒有任何關係的數字

反過來說讓數組A(int的)是映射,其中索引1被映射到A的地址,2被映射到A + 4的地址等等....

1

在一些餐館,當你在櫃檯下單時,他們會給你一個號碼來識別你的訂單。數字:

  • 不需要排序。
  • 不需要是連續

號碼的唯一的想法是,他們可以很容易地找到您的訂單。在地圖/哈希表/關聯數組世界中,數字將是關鍵字,您的順序是數值。

在您完成訂單後,他們可以使用相同的編號進行其他訂單。所以這個數字基本上是某個時間點的訂單的標識符,這將適合對象的屬性可以更改其值的Javascript對象示例。