[音樂播放]
揚聲器1：好吧。
每個人都歡迎回款。
我希望大家都成功 從你的測驗回收
從上週。
我知道這是一個有點瘋狂的時候。
正如我之前說，如果你是 的標準偏差之內，
真的不擔心，尤其是 一個不太舒適的部分。
這是什麼地方，你應該的。
>> 如果你做得很好，那麼真棒。
榮譽給你。
如果你覺得你需要 多一點點的幫助，請
隨時到達 出任何的轉錄因子。
我們都在這裡幫忙。
>> 這就是為什麼我們教。
這就是為什麼我在這裡每週一為你 球員和在辦公時間星期四休息。
因此，請隨時讓我知道 如果你擔心什麼
或者，如果有對任何競猜 你真的想解決的問題。
>> 因此，對於今天的議程 所有關於數據結構。
其中一些只是要公正 為了讓你熟悉這些。
你可能永遠不會實現 他們在這個類中。
有些人你會的， 像你的拼寫PSET。
>> 你有你的選擇 哈希表和嘗試的。
所以我們一定會去在那些。
這將是肯定更有種 高電平部分的今天，雖然
因為有很多人，如果 我們進入的實施細則
所有這些，我們不會 甚至可以通過鏈接列表
也許哈希表的一點點。
>> 所以多多包涵。
我們不打算做 盡可能多的編碼這個時候。
如果您有任何關於它的問題 或者你想看到它實現的
還是自己試試看， 我絕對推薦
要study.cs50.net，這 具有所有的這些例子。
這將有我的學習認證 用音符，我們
傾向於使用以及一些編程 練習，特別是對事
如鍊錶和二進制 樹木堆棧和線索。
這麼少的較高水平，這 也許是很好的你們。
>> 所以這樣，我們就開始吧。
而且，yes--測驗。
我想絕大多數人誰是 我的部分有你的測驗，
但任何人進來，或某種原因，你 不這樣做，他們就在這裡，在前面。
>> 所以鍊錶。
我知道這種雲 您的測驗前備份。
這是一周前 我們了解了這一點。
但是，在這種情況下，我們只 走多一點點深入。
>> 那麼，為什麼我們會選擇一個 鍊錶一個數組？
有什麼區別呢？
是嗎？
>> 聽眾：您還可以擴大一個鏈接 列出與數組的固定大小。
揚聲器1：沒錯。
數組有固定的大小，而一 鍊錶具有可變的大小。
因此，如果我們不知道如何 我們多麼希望存儲，
鍊錶給我們帶來了很大的 辦法做到這一點，因為我們可以只
添加另一個節點上，並添加上 另一個節點，並添加另一個節點上。
但可能是一個權衡？
有誰還記得權衡 數組和鍊錶之間？
Mmhmm​​？
>> 聽眾：你必須 經過一路
通過該鏈接的表 發現列表中的一個元素。
在一個陣列，可以 只要找到一個元素。
>> 揚聲器1：沒錯。
因此，與arrays--
>> 聽眾：[聽不清]。
>> 揚聲器1：數組，我們有 什麼叫做隨機訪問。
也就是說，如果我們要的是 有史以來第五點名單
或第五點是我們 數組，我們只要抓住它。
如果它是一個鍊錶，我們有 遍歷，對不對？
所以，在訪問一個元素 一個陣列是恆定時間，
而用一個鍊錶的那樣 最有可能是線性的時間，因為也許
我們的元件是一路在末端。
我們有過的一切進行搜索。
因此，所有這些數據 我們要去結構
要在花多一點的時間， 哪些長處和底片。
什麼時候我們可能要 使用一個比其他？
這就是種的 更大的東西拿走。
>> 因此，我們必須在這裡 定義一個節點。
這就像在一個元素 我們的鍊錶，對不對？
所以，我們都很熟悉 我們的typedef結構，
我們走過去，在回顧過去的時候。
它基本上只是創造 我們可以使用另一種數據類型。
>> 在這種情況下，它的一些節點 這將在一定整數。
然後什麼是第二部分在這裡？
任何人嗎？
>> 聽眾：[聽不清]。
>> 揚聲器1：是啊。
這是一個指向下一個節點。
因此，這實際上應該是在這裡。
這類型的指針 節點到下一件事情。
而這正是他們 包括我們的節點。
涼爽。
>> 好吧，所以用搜索，因為我們 只是說前手，如果你
要通過搜索， 你必須真正迭代
通過您的鏈接列表。
因此，如果我們要尋找的數量 9，我們將開始在我們的頭上
並指向我們開始 我們的鍊錶，對不對？
我們說好，這是否 節點包含數字9？
不是嗎？
>> 好吧，去下一個。
遵循它。
它包含數字9？
號
按照下一個。
>> 因此，我們必須以實際循環 通過我們的鏈接列表。
我們不能只是去直接到9。
如果你們真的想 看到一些偽代碼在那裡。
在這裡，我們有一些搜索功能 這需要in--需要做些什麼呢？
你有什麼感想？
那麼容易的。
這是什麼？
聽眾：[聽不清]。
揚聲器1：我們正在尋找的數量。
對不對？
什麼會這樣對應？
這是一個指針？
>> 聽眾：一個節點。
>> 揚聲器1：節點列表 我們正在尋找的，對不對？
因此，我們有一些節點的指針位置。
這是一個點，那將 通過我們的名單實際上迭代。
我們設置它等於列表 因為這只是
設置它等於 開始我們的鍊錶。
>> 雖然它不為NULL，而 我們還有東西在我們的列表中，
檢查，看看是否有節點 我們正在尋找的數字。
返回true。
否則，更新它，對不對？
>> 如果為NULL，我們退出我們 while循環並返回false
因為這意味著我們還沒有找到它。
每個人都得到如何工作的？
行。
>> 因此，與插入，你 有三種不同的方式。
您可以預先準備，可以追加 你可以插入到什。
在這種情況下，我們 打算做一個預先準備。
有誰知道這些 3案件可能會有所不同？
>> 所以在前面加上意味著你把 它在列表的前面。
因此，這將意味著，不管 你的節點，無論
價值是什麼，你要 把它放在這裡在前面，好不好？
這將成為第一 元素在列表中。
>> 如果您添加它，它是怎麼回事 去你的列表的後面。
並插入到什意味著你 打算把實際進入的地方
它讓你的鏈接列表進行排序。
同樣，你如何使用 這些，當你使用
他們會根據你的情況而有所不同。
如果不需要 進行排序，在前面加上趨於
是大多數人 使用，因為你不知道
要經過整個列表 尋找到底添加它，對不對？
你可以把它貼對世權。
>> 因此，我們將通過一個 插入1現在。
這麼一件事，我要去 強烈建議在此PSET
是畫出來的東西，一如既往。
這是你更新是非常重要的 以正確的順序你的指針
因為如果你更新它們 稍微亂序，
你要結束了 失去你的列表的一部分。
>> 因此，例如，在這種情況下，我們 告訴頭只點1。
如果我們只是做了 不保存這個1，
我們不知道是什麼 1應指向現在
因為我們已經失去了什麼 該負責人指出。
所以，有一點要記住 當你做了預先準備
是拯救什麼 頭分排名第一，
然後重新分配它，然後更新 你的新節點應該指向。
在這種情況下，這是為了做到這一點的方法之一。
>> 因此，如果我們做了這種方式 在這裡我們只是重新分配頭，
我們失去了我們的基本 整個列表，對不對？
做到這一點的方法之一是有1個點 接下來，再有頭點1。
或者，你可以種不喜歡的 臨時存儲，這是我所津津樂道。
>> 但是，重新分配你的 以正確的順序指針
將是非常，非常 重要的是這個PSET。
否則，你將有一個哈希 表或一個嘗試，這只是將要
的話只有部分是你 想要再you're-- mmhmm？
聽眾：什麼是臨時 存儲的東西你在說什麼？
揚聲器1：臨時存儲。
所以基本上另一 這樣你可以這樣做
是存放東西的腦袋，像 存放臨時變量。
其分配到1 然後更新1點
以什麼頭用來指向。
這種方式顯然是 因為你更優雅
不需要一個臨時值，但 只是提供了另一種方式來做到這一點。
而我們實際上做有 一些代碼這一點。
所以對於鍊錶，我們 實際上有一些代碼。
所以在此處插入，這是預先考慮。
所以這個進入它的頭。
>> 所以第一件事情，你需要 當然，創造你的新節點，
並檢查是否為NULL。
總是好的。
然後你需要指定的值。
當你創建一個新的節點，你 不知道它的指向下一個，
所以你想要初始化為NULL。
如果它最終指向事 否則，它就會被重新分配，它的罰款。
如果這是第一件事情 在列表中，則需要
指向null，因為 這是該列表的末尾。
>> 所以後來插入的話，我們在這裡看到我們 被分配了節點的下一個值
是什麼頭， 這就是我們不得不在這裡。
這就是我們只是做了。
然後我們分配頭點 我們的新節點，因為要記住，
新是一些指針到一個節點， 而這正是頭是什麼。
這就是為什麼我們 有這個箭頭訪問。
很酷吧？
Mmhmm​​？
>> 聽眾：我們得 初始化新的下一位第一為NULL，
或者我們只是把它初始化為頭？
>> 揚聲器1：新下一個 需要為NULL啟動
因為你不知道 那裡將是。
此外，這是怎麼樣的 就像一個範例。
你將其設置為NULL只是為了 確保你所有的基地都覆蓋
你這樣做，任何重新分配前 你總是保證它會
被指向的特定值 與像一個垃圾值。
因為，是的，我們分配 新的自動接下來，
但它更多的只是像 好的做法進行初始化
以這種方式，並重新分配。
>> 好了，現在雙鍊錶。
我們怎麼想的？
有什麼不同 雙向鍊錶？
>> 所以在我們的鍊錶，我們可以 只朝一個方向，對不對？
我們只有下一個。
我們只能往前走。
>> 用一個雙向鍊錶， 我們還可以向後移動。
因此，我們不僅 我們要存儲號碼，
我們有它指向下一個 當我們剛剛從。
所以這允許 一些更好的遍歷。
>> 因此，雙向鍊錶節點， 非常相似的，對不對？
唯一不同的是，現在我們 有下一個和前一個。
這是唯一的區別。
>> 所以，如果我們要在前面或append--我們 沒有任何代碼此向上這裡 -
但如果你要嘗試 插入，最重要的事情
就是你需要 確保你分配
無論你以前和你 下一個指針正常。
因此，在這種情況下，你會 不僅初始化旁邊，
在初始化以前。
如果我們在列表的頭部，我們 不但使頭部等於新，
但我們的新的前應 點了頭，對吧？
>> 這是唯一的區別。
如果你想有更多的實踐 這些用鍊錶，用插入，
與刪除，插入帶 成什錦列表，
請查看study.cs50.net。
有一群偉大的演習。
我極力推薦他們。
我希望我們有時間去通過他們 但有很多數據結構
打通。
>> 好了，哈希表。
這可能是最 您PSET有用位
在這裡，因為你將要 執行其中的一個或一試。
我真的很喜歡哈希表。
他們很酷。
>> 所以基本上什麼 發生的情況是一個哈希表
當我們真正需要迅速 插入，刪除和查找。
這些都是東西，我們 在哈希表中優先考慮。
他們可以得到相當大的， 但我們會嘗試用看，
有些事情是要大得多。
>> 但基本上，所有的散列 表是散列函數
告訴你哪個桶把每 您的數據，每一個在你的元素。
一個簡單的方法去思考一個哈希表 是它的事情只是水桶，
對不對？
所以，當你被排序的東西 就像他們的名字的第一個字母，
這有點像一個哈希表。
>> 所以，如果我是組你們是 到誰的名字開始組
用A看過來，或者誰的生日 在一月，二月，三月，
什麼，那就是有效 創建哈希表。
它只是創造了水桶 你的元素進行排序成
這樣您就可以找到他們更容易。
所以這樣一來，當我需要 找一個你，
我沒有搜索 通過您的每一個名字。
我可以想，哦，我知道， 丹妮的生日是in--
聽眾：--April。
揚聲器1：四月。
所以我看在我四月份 鬥，與任何運氣，
她會在那裡唯一的一個， 我的時間是在這個意義上不變，
而如果我要看看 通過一大堆的人，
這將花費更長的時間。
因此，哈希表是真的只是水桶。
簡單的方法，他們的看法。
>> 因此，關於一個很重要的事情 哈希表是一個散列函數。
所以事情我剛才講的，像 您的名字的第一個字母
或者你的生日月， 這些想法，
真關聯到哈希函數。
這是確定的只是一個方式，也 鬥你是元素進入，OK？
因此，對於這pset中，你可以看一下 幾乎任何你想要的哈希函數。
>> 並不一定是你自己。
有一些很酷的的人了 那裡，做各種瘋狂的數學。
如果你想使你的 拼寫檢查超快，
我肯定會 看看其中的一個。
>> 但也有在 簡單的，如計算
的話，總和一樣 每個字母的數。
計算總和。
用於確定桶。
他們也有難辦的 就像所有的A的位置，
所有的B的在這裡。
這些中的任何一個。
>> 基本上，它只是告訴你哪個 數組索引你的元素應該進入。
剛剛決定bucket-- 這是所有的哈希函數是。
所以在這裡，我們有一個例子是 字符串的只是第一信
我只是在談論。
>> 所以，你有一些散，這僅僅是 您的字符串減去A的第一個字母，
這會給你一些 介於0和25號。
和你想要做的是什麼 確保這代表
您的散列的大小table-- 多少個水桶也有。
許多這類 散列函數，它們是
將要返回的值可能 要遠遠高於桶的數量
那你確實有 在哈希表
所以你需要 肯定和那些國防部。
否則，它會說， 哦，應該是在5000桶
但你只有30 水桶中的哈希表。
當然，我們都知道這是 會導致一些瘋狂的錯誤。
所以一定要確保由於MOD 您的哈希表的大小。
涼爽。
所以碰撞。
是每個人都好這麼遠嗎？
Mmhmm​​？
>> 聽眾：為什麼會 返回這樣一個龐大的價值呢？
>> 揚聲器1：根據不同的算法 您的哈希函數使用。
有些人會做 瘋狂繁殖。
它的所有有關獲取 一個均勻分佈，
所以他們做一些真正 有時是瘋狂的事情。
就這樣。
還要別的嗎？
行。
>> 所以碰撞。
基本上，正如我剛才所說， 在最好的情況下，
任何鬥我看看是 將有一件事，
所以我沒有看全，對不對？
我不是知道它的存在，或者它 不，這是我們真正想要的。
但是，如果我們有數万 數據點和小於號
桶，我們將有 碰撞中，最終的東西
即將要結束了 鬥已經有一個元素。
>> 所以，問題是，什麼樣 我們在這種情況下怎麼辦？
我們該怎麼辦？
我們已經有了的東西呢？
難道我們只是把它扔出去？
>> 號
我們必須保持他們兩個。
這樣的方式，我們 通常做的是什麼嗎？
是什麼數據結構 我們剛才講？
聽眾：鍊錶。
揚聲器1：鍊錶。
所以，現在的，而不是每個這些 水桶只是有一個元素，
它會包含一個鏈接列表 這被散列到它的元素。
好了，大家都種得出來的？
因為我們不能有一個數組 因為我們不知道有多少東西
將要在那裡。
鍊錶可以讓我們 剛剛確切的數字，
被散列成水桶，對不對？
>> 所以線性探測是 基本上這idea--
這是應對碰撞的一種方式。
你可以做的是，如果在這 情況下，漿果被散列到1
我們已經有了 那裡的東西，你只要
繼續下去，直到 你找到一個空槽。
這是一種方式來處理它。
另一種方式來處理 它是我們剛才
called--鏈接 列表被稱為鏈接。
>> 所以這個想法，如果工作 您的哈希表，你認為
比大得多 您的數據集，或者如果你
想嘗試和減少鏈接 直到它的絕對必要。
因此，有一點是線性的 探測手段明顯
您的散列函數 是不是很實用
因為你要使用到結束 您的散列函數，得到一個點，
你的線陣探頭向下 一些地方可用。
但現在，當然，任何事情 別人說結束了那裡，
你將不得不 搜索甚至進一步下跌。
>> 而且還有很多更 搜索的費用
進入輸入一個元素 在現在的哈希表，對不對？
而現在，當你去嘗試和發現 漿果再次，你要湊吧，
而且它會說， 哦，在鬥1看，
而且它不會是 在鬥1，所以你
將不得不穿越 通過對這些休息。
所以，它有時是有用的， 但在大多數情況下，
我們要指出， 鏈接是你想做的事。
>> 所以，我們談到了這點。
我得到了我自己一點點前進。
但鏈基本上是 在哈希表中的每一桶
僅僅是一個鍊錶。
>> 這樣的另一種方式，或更多的技術 這樣，想到一個哈希表
是，它只是一個數組 鍊錶，哪
你寫你的字典時， 而你試圖加載它，
想到它是一個 鍊錶的數組
將使它更容易 為您初始化。
>> 聽眾：所以哈希表 具有預定的大小，
像水桶的[聽不清]？
>> 揚聲器1：沒錯。
所以它有一組數 你determine--桶
這你們應該 隨便玩。
它可以是很酷 看看會發生什麼
當你改變你的桶數。
但是，是的，它有一個 桶的設置數量。
是什麼讓你滿足的 因為你需要很多元素
這是單獨的鏈接，你 已在每個桶鍊錶。
這意味著你的哈希表 會完全大小
你需要它，對不對？
這就是鍊錶的整點。
涼爽。
>> 所以每個人都需要幫助嗎？
行。
啊。
剛剛發生了什麼？
現在真的。
猜猜誰是殺害我。
>> OK，我們要進入 嘗試，這是一個有點瘋狂。
我喜歡的哈希表。
我覺得他們真的很酷。
嘗試涼爽了。
>> 因此，沒有人記得一試的是？
你應該已經走了過來 它簡要地講？
你還記得那種它是如何工作的？
聽眾：我只是點頭 我們也去了吧。
揚聲器1：我們過目一下。
OK，我們真的要去 在它現在是我們在說什麼。
>> 聽眾：這是一個檢索樹。
>> 揚聲器1：是啊。
這是一個檢索樹。
真棒。
所以，有一點這裡要注意的是，我們 正在尋找單個字符
在這裡，對不對？
>> 所以在我們的哈希函數，我們 所尋找的單詞作為一個整體，
現在我們正在尋找更多的 在人物了吧？
因此，我們有麥克斯韋在這裡和孟德爾。
所以基本上一個try--的方式來思考 這個是每個層次在這裡
是字母數組。
因此，這是你的根結在這裡，對不對？
這具有的所有字符 字母的每一個字的開始。
>> 和你想要做的是什麼 說好，我們有一些M個字。
我們要尋找麥克斯韋，所以 我們去的M.和M點整
另外一個數組，其中每 總之，只要存在
是一個具有一個字 作為第二個字母，
只要有一個字 有B作為第二個字母，
它將有一個指針 去一些旁邊的數組。
>> 有可能不是一個 詞MP的東西，
所以在此P位置 數組，它只是為NULL。
它會說，OK，沒有字 即有m個後跟一個P，好不好？
因此，如果我們仔細想想，每個 這些較小的事情之一
實際上是其中之一 到Z大陣列從A
那麼，什麼可能的事情之一 這是怎樣的一個嘗試的缺點呢？
>> 聽眾：大量的內存。
>> 揚聲器1：這是一噸的記憶，不是嗎？
每一個這些塊在這裡 代表26位，26個元素的數組。
因此，試圖獲得令人難以置信的太空沉重。
>> 但他們都非常快。
如此令人難以置信的速度快，但 真是浪費空間。
那種有圖 哪一個你想要的。
這是真的很酷您PSET， 但他們佔用了大量的內存，
所以你權衡。
是嗎？
>> 聽眾：有沒有可能 建立一個嘗試，然後
一旦你把所有的 你need--在它的數據
我不知道這是否會是有意義的。
我擺脫所有 NULL字符，但隨後
你就不能夠索引them--
>> 揚聲器1：您仍然需要他們。
>> 聽眾： - 每次以相同的方式。
揚聲器1：是啊。
您需要NULL字符來讓 你知道，如果有沒有一個字出現。
奔你有什麼，你想要什麼？
行。
好了，所以我們要 去多一點點
進入技術細節的背後 一試，並通過一個實例運行。
>> 好了，這是同樣的事情。
而在一個鍊錶，我們的主要 那種of--什麼是我想要的字？ -
像積木是一個節點。
在一個嘗試，我們也有一個節點， 但它的定義不同。
>> 因此，我們有一些布爾值， 代表實際上無論是詞
存在於這個位置，然後 我們有一些陣這裡 - 或者更確切地說，
這是一個指向 陣列的27個字符。
這是因為，在這種情況下，這 27--我相信在座的各位都是這樣，等待，
有字母表中的26個字母。
為什麼我們有27？
>> 這樣根據不同的 要實現這種方式，
這是從一個pset中那 允許撇號。
所以這就是為什麼額外的之一。
您還可以有一些 情況下，空終止
被包含的所述一個 即它允許為字符，
這就是他們如何檢查 看它是否是該字的結束。
如果您有興趣，請查看 凱文的視頻study.cs50，
以及維基百科 一些很好的資源在那裡。
>> 但是，我們要通過正中下懷 您可能如何工作，通過一試
如果你正在考慮之一。
因此，我們有一個超級簡單的在這裡， 有句話“蝙蝠”和“縮放”在其中。
正如我們看到的在這裡， 在這裡這個小空間
代表了我們的布爾值， 說，是的，這是一個字。
然後這有我們 字符數組，對不對？
>> 所以，我們要通過 發現在這個嘗試“蝙蝠”。
所以，從高層開始，對不對？
我們知道，B對應 第二索引，所述第二元件
在這個陣列中，因為a和b。
所以大約第二個。
>> 它說，OK，冷靜，按照成 下一個陣列，因為如果我們記得，
這並不是說所有這些 實際上包含元件。
這些陣列中的每一個 包含一個指針，對不對？
這是做一個重要的區別。
>> 我知道這是要be--嘗試的 真的很難得上是第一次，
所以，即使是這樣的 第二次或第三次
而且它仍然是一種 看似很難的，
我保證，如果你去觀看 短期再度明天
這可能會使得很多更有意義。
這需要大量的消化。
我有時仍然很 象，等等，什麼是一試？
我該如何使用呢？
>> 所以我們B在這種情況下， 這是我們的第二個索引。
如果我們有，比方說，C或 d或任何其他字母，
我們需要映射回索引 我們的數組的對應。
因此，我們將採取類似rchar，我們只是 減去掀起了將其映射到0〜25。
大家好，我們怎麼樣 地圖我們的角色？
行。
>> 所以我們去的第二個和我們 看，是的，它不是為NULL。
我們可以繼續在下一個數組。
所以我們去到這一個陣列在這裡。
>> 和我們說，好了，現在我們 需要看到，如果是在這裡。
為空或做它 其實往前走？
所以實際上移動 轉發此數組中。
我們說好，t是我們的最後一個字母。
所以我們去到T的索引。
然後我們繼續前進 因為有另一個。
而這一次，基本上說，是的， 它說，有一句話這裡 -
如果你遵循這一點， 路徑，你已經到了
在一個字，這是我們所知道的是“蝙蝠”。
是嗎？
>> 聽眾：是不是標準有 為索引0，然後有一個排序的1
或有在結束了嗎？
>> 揚聲器1：第
因此，如果我們回頭看我們的 在這裡聲明，這是一個布爾值，
所以它在你的節點自身的元素。
所以它不是數組的一部分。
涼爽。
所以，當我們完成我們的話，我們很 在這個數組，我們想要做的
是做一個檢查，這是一個單詞。
在這種情況下，它會返回是。
>> 所以，關於這一點，我們知道“動物園” - 我們知道，作為人類的“動物園”是一個詞，
對不對？
但盡量會在這裡 說，不，它不是。
它會說，因為我們 沒有指定它作為這裡一個字。
儘管我們可以遍歷 通過對這個陣列中，
這種嘗試會說，不， 動物園是不是在你的字典
因為我們還沒有 指定它是這樣。
>> 因此從另一個角度做that-- 哦，對不起，這一項。
所以在這種情況下，“動物園”是不 一個字，但它是在我們的嘗試。
但在這其中，說我們想讓它 介紹詞“洗澡”，會發生什麼
是我們遵循through-- B，A，T。
我們在這個數組中， 我們去尋找小時。
>> 在這種情況下，當我們 看指針小時，
它指向NULL，好不好？
所以，除非它是明確的 指著另一個數組，
你以為所有的指針 在這個陣列指向空。
所以在這種情況中，h是指向 為null，所以我們不能做任何事情，
因此它也將返回 假的，“洗澡”是不是在這裡。
所以，現在我們實際上 要經過
怎麼會，我們實際上說 該“動物園”是我們的嘗試。
我們如何將“動物園”到我們試試？
所以在我們開始以相同的方式 我們的鍊錶，我們從根開始。
如有疑問，開始 這些東西的根源。
>> 我們會說，OK，Z。
ž存在於此，並且它的作用。
所以你移動到 你的下一個陣列，好不好？
然後就下單， 我們說好，不Ø存在嗎？
它的作用。
這再次。
>> 等我們下單，我們已經說過了， OK，“動物園”已經存在這裡。
所有我們需要做的是設置此相等 為true時，有一個詞出現。
如果你遵循了一切 到該點之前，
這是一個字，所以只 設置它等於這樣的。
是嗎？
>> 聽眾：所以後來做了 意思是“巴”是一個字也？
>> 揚聲器1：第
因此，在這種情況下，“巴”，我們會得到 在這裡，我們想說的是一個字，
並且它仍然是否定的。
行？
Mmhmm​​？
>> 聽眾：所以一旦你是一個 一句話，你說是，那麼它
將包含去米？
>> 揚聲器1：所以這個必須做 with--你加載此研究。
你說的“動物園”一詞。
當你去check-- 喜歡，說你想說的話，
在這個字典裡“動物園”的存在？
你只會搜索“動物園” 然後檢查，看它是否是一個字。
你永遠不會動 通過對米，因為這不是
您要查找的內容。
>> 因此，如果我們真的想 添加“洗澡”這個嘗試，
我們會做同樣的事情 當我們用做“動物園”
除了我們看到，當我們 嘗試，並得到為h，它不存在。
所以，你可以認為這是試圖 以添加新節點插入到一個鍊錶，
所以我們需要添加另一個 其中的一個陣列，像這樣。
然後我們要做的是，我們剛剛成立的H 這個數組指向這個元素。
>> 然後什麼我們要在這裡做？
添加它等於true 因為它是一個字。
涼爽。
我知道。
嘗試都不是最激動人心的。
相信我，我知道。
>> 這麼一件事與嘗試實現， 我說，他們是非常有效的。
因此，我們已經看到了他們 佔用大量的空間。
種他們混淆。
那麼，為什麼我們曾經使用過這些？
我們使用這些，因為他們是 令人難以置信的高效。
>> 因此，如果你曾經期待 一個字，你是唯一的
由字的長度的限制。
所以，如果你正在尋找一個 字是一個長度為5的，
你永遠只能將不得不 讓最多5攀比，好不好？
所以它使基本上是一個常數。
就像插入和查詢 基本上都是固定的時間。
>> 所以，如果你能永遠得到 東西在一定的時間，
這是因為它得到不錯的。
你不能得到更好的比 固定時間為這些事情。
以便為所述一個 嘗試了巨大的加號。
>> 但它是一個很大的空間。
樣的，所以你必須決定 什麼對你更重要。
而在今天的電腦， 空間的一個嘗試可能最多
也許不影響 你那麼多，但也許
你在處理事情 有遠遠更多的東西，
並嘗試恰恰是不合理的。
是嗎？
>> 聽眾：等等，讓你有26 在每一個人信嗎？
>> 揚聲器1：Mmhmm​​。
是啊，你有26。
你有一些是字標記，然後 你有26球在每個人。
他們正在point--
>> 聽眾：和每一個26， 難道他們各有26？
>> 揚聲器1：是的。
這就是為什麼，因為你可以 看，它擴展相當迅速。
行。
所以，我們要進入樹， 我覺得喜歡的是更簡單，大概會
是一個可愛的小死緩 從那裡嘗試。
所以希望你們中的大多數 以前看過一棵樹。
不喜歡漂亮 外面的人，這是我
不知道是否有人 去戶外最近。
我去採摘蘋果本週末， 哦，我的天哪，這是美麗的。
我不知道葉子 可以看看那個漂亮。
>> 所以這只是一棵樹，對不對？
這只是一些節點，並且它 指著一堆其他節點。
正如你在這裡看到，這是 樣一個反复出現的主題。
節點指向的節點是怎麼樣的 許多數據結構的本質。
這只是取決於我們如何 讓他們指向對方
以及我們如何遍歷 通過他們，我們如何
插入的東西，它決定 各自不同的特性。
>> 所以只是一些術語， 我以前使用過。
所以，根本是不管是在最高層。
這就是我們總是開始。
你可以把它作為負責人也。
但對於樹木，我們往往 稱其為根部。
>> 凡是在底部這裡 - 在非常，非常bottom--
都認為葉。
因此，隨之而來的 整棵樹的事，對不對？
葉子是在你的樹的邊緣。
>> 然後我們也有幾個 術語談論有關節點
給對方。
因此，我們有父母， 孩子和兄弟姐妹。
所以在這種情況下，圖3是 父的5，6和7。
因此，家長無論是 一步以上不管你是
參照，所以才 就像一個家庭樹。
但願，這是所有有點 位比嘗試更直觀。
>> 兄弟姐妹是任何有 同樣的父母，對不對？
他們在這裡的同一水平。
然後，因為我是 他說，孩子們剛
無論是低於一步 有問題的節點，好不好？
涼爽。
這樣的二進制樹。
任何人都可以猜測的一 二叉樹的特點是什麼？
>> 聽眾：最多兩片葉子。
>> 揚聲器1：沒錯。
所以，最大的兩片葉子。
因此，在這個人之前，我們有這個 這有三個，但在一個二叉樹，
你有最多兩個 每個父母的孩子，對不對？
還有一個 有趣的特性。
有誰知道？
二叉樹。
>> 所以二叉樹將擁有一切 在the--這個人是不是sorted--
但在一個排序二叉樹， 一切都在正確的
大於父 一切都在左邊
小於母體。
並且已經交了白卷 問題之前，那麼好就知道了。
因此，我們定義這個方式， 再次，我們有另一個節點。
這看起來非常相似呢？
雙
>> 聽眾：鍊錶
>> 揚聲器1：雙鍊錶，對不對？
因此，如果我們替換此 有一個和下一個，
這將是一個雙向鍊錶。
但是，在這種情況下，我們實際上 有左，右，僅此而已。
否則，它是完全相同的。
我們還有元素 你要找的，
而你只需要兩個指針 要去什麼是下一個。
是啊，所以二叉搜索樹。
如果我們發現，一切都在 這裡是更大than--
或立即的一切 這裡的權利
是大於一切 這裡是小於。
>> 所以，如果我們通過搜索，它 看起來應該非常接近二分查找
在這裡，對不對？
除外，而不是找 在一半的陣列，
我們只是在尋找在任左 側或右側的樹。
所以就有點簡單，我想。
>> 所以，如果你的根是空的， 顯然這只是假的。
而如果它的存在，很明顯這是真的。
如果是小於，我們尋找的左側。
如果是大於， 我們搜查的權利。
它是完全一樣的二進制搜索， 只是一個不同的數據結構
我們使用。
代替數組， 它只是一個二叉樹。
>> OK，棧。
而且，看起來我們 可能有一點點時間。
如果我們這樣做，我很高興去 在任何這一次。
OK，所以棧。
有誰還記得stacks-- 一摞任何特點？
>> 好了，我們大多數人，我想， 在餐廳吃飯halls--
就像我們可能不喜歡。
但很明顯，你可以把一疊 從字面上就如同一摞托盤
或堆疊的事情。
和什麼是重要的 要知道的是，它的
something--特徵 我們把它叫做by--是後進先出法。
有誰知道這代表著什麼？
Mmhmm​​？
>> 聽眾：後進先出。
>> 揚聲器1：沒錯，後進先出。
所以，如果我們知道，如果我們的東西堆放 起來，最簡單的事情搶off--
也許我們唯一可以搶 關閉如果我們的協議棧是大enough--
是頂級元素。
所以，無論是放在 last--我們在這裡看到，
不管是推 在大多數recently--是
將成為第一 我們流行過，東西好不好？
>> 所以，我們在這裡是 另一個typedef結構。
這真的只是喜歡 在數據結構速成班，
所以有很多扔向你們。
我知道。
因此，另一種結構。
耶的結構。
>> 在這種情況下，它的一些指針 到具有一定容量的陣列。
因此，這代表了我們的協議棧 在這裡，像我們實際的數組
這是我們持有的元素。
然後在這裡我們有一些大小。
>> 而通常情況下，你要保持 曲目有多大的堆棧
因為它是怎麼回事，讓 你要做的就是，如果你知道的大小，
它可以讓你說的， 好吧，我是在能力？
我可以添加些什麼？
它也告訴你 在您的堆棧的頂部
那麼你知道你 其實可以起飛。
而這實際上是要 有一點更清楚這裡。
>> 因此，對於推，一件事，如果你 是有史以來實施推，
我只是說，你的 棧的大小有限，對不對？
我們的陣列有一些能力。
這是一個數組。
這是一個固定大小的，所以我們需要 確保我們不會把更多
到我們的數組要比我們 實際上有空間。
>> 所以，當你創建一個推 功能，你做的是說好第一句話，
做我的空間我的籌碼？
因為如果我不這樣做，對不起， 我不能存儲你的元素。
如果我這樣做，那麼你想存儲 它在堆棧的頂部，對不對？
>> 這就是為什麼我們有 跟踪我們的規模。
如果我們不保持我們這樣規模的軌道， 我們不知道放在哪裡。
我們不知道有多少東西 在我們的數組了。
就像明明有方法 也許你可以做到這一點。
你可以初始化所有設置為NULL 然後檢查最新NULL，
但一個更容易的事情僅僅是 說，OK，跟踪大小。
就像我知道我有四個要素 在我的數組，所以接下來的事情
我們換上，我們 將存儲在索引4。
然後，當然，這意味著 你已經成功地推的東西
到你的籌碼，你 要增加大小
讓你知道你是如此 那你可以把更多的東西。
>> 所以，如果我們試圖彈出 事關棧，
可能是什麼的第一件事 我們要檢查？
你想採取 事關你的籌碼。
你肯定有 在堆棧中的東西嗎？
號
所以，什麼才是我們要檢查？
>> 聽眾：[聽不清]。
揚聲器1：檢查的大小？
尺寸。
因此，我們要檢查，如果看 我們的規模是大於0，OK？
如果是，那麼我們需要減小 我們的規模由0和返回。
為什麼呢？
>> 在第一個我們 推，我們推
上的尺寸，然後更新的大小。
在這種情況下，我們正在遞減大小 然後把它關閉，它拔毛
從我們的數組。
為什麼會那樣做？
所以，如果我有一件事對我的籌碼， 這將是我的尺寸在這一點？
1。
>> 何為元素1儲存在哪裡？
什麼指標？
聽眾：0。
揚聲器1：0。
所以在這種情況下，我們 總是需要使sure--
而不是返回 大小減去1，因為我們
知道我們的元素是 將要被存儲在1以下
無論我們的規模是，這 只需要照顧它。
這是一個稍微更優雅的方式。
我們只是減小了 大小，然後返回大小。
Mmhmm​​？
>> 觀眾：我想剛才在一般情況下， 為什麼會這個數據結構
是有益的？
>> 揚聲器1：這取決於你的環境。
因此對於一些理論， 如果你的工作with-- OK，
讓我看看，如果有一個有利的1 那就是超過外面有利
的CS。
隨著棧，任何時候你需要 跟踪事
是最近添加的是當 你將要使用的堆棧。
>> 我想不出一個好 舉例說，現在。
但每當最近 事情是對你最重要，
這是一個堆棧時， 將是有用的。
我試圖想，如果 有一個很好的這一點。
如果我覺得一個很好的例子，在未來 20分鐘後，我一定會告訴你的。
>> 但總體而言，如果有什麼事， 就像我說的最多的，其中，最近
最重要的是，這是 其中，一摞用武之地。
而隊列是一種相反的。
和所有的小狗狗。
這不是很大的，對不對？
我覺得我應該 只是有一個小兔子的視頻
右中的中間 節為你們
因為這是一個強烈的部分。
>> 這樣一個隊列。
基本上一個隊列是像一條線。
你們我敢肯定，使用這種日常生活， 就像在我們的食堂。
因此，我們必須去 並得到我們的托盤，我
確保你有排隊等候 刷卡或讓你的食物。
>> 因此，區別就在這裡 是，這是FIFO中。
所以，如果是後進先出後進，先 出，先進先出是先入先出。
因此，這是不管你把 第一次是你最重要的。
所以，如果你在等待 在line--可以嗎
想像一下，如果你去了 去獲得新的iPhone
並且它是一個堆棧，其中 最後一個人符合了它​​的第一，
人們會互相殘殺。
>> 所以FIFO，我們都很熟悉 在這裡，在現實世界中，
而這一切，是因為有實際 種重現這一整條生產線
和排隊結構。
如此而用棧， 我們有push和pop。
同一個隊列，我們有 入隊和出隊。
所以排隊的基本含義 把它放到後面，
和出隊採取的手段 斷從前面。
因此，我們的數據結構是一 稍微有點複雜。
我們有第二個事情防不勝防。
>> 因此，沒有了頭，這 正是堆棧，對不對？
這是相同的結構的堆疊。
唯一不同的是，現在我們 有這個頭，這你怎麼看
是要跟踪的？
>> 聽眾：第一個。
>> 揚聲器1：對， 我們把第一件事。
我們的隊列的頭。
誰是排在第一位。
好吧，如果我們做排隊。
再次，與任何 這些數據結構
因為我們處理的是一個數組， 我們需要檢查一下，如果我們有空間。
>> 這有點像我說 你們這些傢伙，如果你打開一個文件，
你需要檢查空。
與任何這些堆棧 和隊列，你需要
看看是否有空間，因為我們 處理一個固定尺寸數組，
我們看到這裡 - 0，1都達5。
那麼，我們在這種情況下是檢查 看看我們仍然有空間。
是我們的規模小於容量是多少？
>> 如果是這樣，我們需要將其存儲在 尾部，我們更新我們的規模。
那麼，什麼可能的尾巴在這種情況下？
它沒有明確地寫出來。
我們將如何保存呢？
什麼尾巴呢？
>> 因此，讓我們步行穿過這個例子。
因此，這是一個大小為6的數組，對不對？
而我們現在所擁有的，我們的規模是5。
而當我們把它放在，這是怎麼回事 進入第五個指標，對不對？
因此，存儲在尾部。
>> 另一種方式來寫尾部也只是 是我們的數組大小​​的指標，對不對？
這是5號。
接下來的事情將要進入5。
很酷吧？
行。
它變得稍微複雜 當我們開始用頭搞亂。
是嗎？
>> 聽眾：這是否意味著我們 會宣布一個數組，
是五行長 那麼，我們要添加到它？
>> 揚聲器1：第
所以在這種情況下，這是一個堆棧。
這將宣布 作為規模6的數組。
在這種情況下，我們 只有一個剩餘空間。
>> 好了，有一件事是在這 情況下，如果我們的頭是0，
那麼我們就可以在大小添加。
但它變得有點棘手 因為實際上，他們
不具備滑動 對於這一點，所以我要去
畫之一，因為它不是 曾經想像中的那麼簡單，你
開始擺脫的東西。
因此，而用棧 你永遠只能有
擔心大小是什麼 當你添加的東西上，
一個隊列，你還需要 確保你的頭被佔，
由於對隊列一件很酷的事情 是，如果你沒有能力，
你其實可以把它環繞。
>> OK，所以一件事 - 哦， 這是可怕的粉筆。
有一點要考慮的是這種情況。
我們就做五。
好了，我們要 說的頭就在這裡。
這是0，1，2，3，4。
>> 頭的存在，並 請有東西在其中。
我們要添加的東西，對吧？
於是事情，我們需要 知道的是，頭總是
要移動這樣的， 然後循環回到我的身邊，好不好？
>> 所以這個隊列有空間的，對不對？
它有空間，在一開始， 那種此相反的。
因此，我們需要做的是我們 需要計算的尾巴。
如果你知道你的 頭沒有移動，尾巴
只是你的數組 大小的指標。
>> 但在現實中，如果你使用一個隊列， 你的腦袋可能是被更新。
所以，你需要做的是 實際計算的尾巴。
所以，我們做的是這個公式 在這裡，我打算讓你
你們想想，和 然後我們會談論它。
因此，這是能力。
>> 所以這實際上 給你一個辦法做到這一點。
因為在這種情況下，是什麼？
我們的頭是1，我們的規模是4。
如果我們這國防部5，我們得到0， 這是我們應該輸入它。
>> 如此則在下一情況下， 如果要做到這一點，
我們說，好吧，讓我們出列的東西。
我們出列了。
我們拿出這個元素，對不對？
>> 現在我們的頭指指點點， 我們要在另一件事情補充。
這基本上是 回到我們這行的，對不對？
隊列可以在陣列周圍包裹。
這是主要區別之一。
堆棧，你不能做到這一點。
>> 隨著隊列，您可以 因為所有的事項
是，你知道什麼 最近被添加。
因為一切都在以复加 此向左方向，在這種情況下，
然後環繞，你可以 繼續投入新元素
在陣列的前 因為它不是真的
陣列的前面了。
你能想到的初 數組的地方你的頭居然是。
>> 所以這個公式是怎麼 你計算你的尾巴。
這是否有道理？
行。
OK，出列，然後 你們有10分鐘
要問我任何澄清的問題 你想要的，因為我知道這很瘋狂。
>> 好吧，所以在相同的方式 - 我不知道你們注意到了，
但CS是所有關於模式。
東西是相當多的 同樣的，只需用很小的調整。
這裡這麼一回事。
我們需要檢查一下，看看我們是否真正 有東西在我們的隊列，對不對？
說好，是我們的規模大於0？
涼爽。
>> 如果我們這樣做，那麼我們把我們的頭，這 就是我剛才在這裡展示。
我們更新我們的頭要多一個。
然後我們減了 尺寸，並返回該元素。
>> 有更具體 在study.cs50.net代碼，
我強烈建議你 通過它，如果你有時間，
即使它只是一個偽代碼。
如果你們想通過談話 與我一對一，請讓我
知道了。
我很樂意。
數據結構中，如果 你把CS 124，你會
知道數據結構變得非常 樂趣，這是剛剛開始。
>> 所以，我知道這很難。
沒關係。
我們奮鬥。
我還是做了。
所以不要太擔心了。
>> 但是，這基本上是你 在數據結構速成班。
我知道這是一個很大。
還有什麼是我們 想去一遍？
任何我們想通過談話？
是嗎？
>> 顧客：這個例子，所以 新尾為0了嗎？
揚聲器1：是的。
聽眾：OK。
所以後來經歷， 你有1加4 or--
>> 揚聲器1：所以你是說， 當我們想要去做到這一點了嗎？
聽眾：是的。
所以，如果你搞清楚out--在哪裡 你計算從該尾？
>> 揚聲器1：所以尾巴 是in--我改變了這一點。
所以在這裡本實施例中，這是 我們正在尋找，確定的數組？
因此，我們必須在1，2，3和4的東西。
因此，我們有我們的頭是等於1 這一點，我們的大小等於4
在這一點上，對不對？
>> 大家都同意的話？
所以我們做頭部加上大小，這 給我們5，然後我們用5國防部。
我們得到0，這告訴我們，0 哪裡是我們的尾巴，在那裡我們有空間。
>> 聽眾：什麼是上限？
>> 揚聲器1：容量。
抱歉。
所以這是你的數組的大小。
是嗎？
>> 聽眾：[聽不清]前 我們返回的元素？
>> 揚聲器1：因此，我們將 前往或返回的那一刻？
因此，如果我們移動一個，減小尺寸是多少？
堅持，稍等。
我肯定忘了另外一個。
沒關係。
沒有另一個公式。
是的，你會想返回 頭，然後將其移回。
>> 聽眾：OK，因為在這 點，頭是0，
然後，你要回 指數0，然後使頭1？
>> 揚聲器1：沒錯。
我認為還有另一種 公式有點像這樣。
我沒有在這上面我的​​頭 我不想給你錯了。
但我認為這是完全有效的 比方說，OK，保存該element--什麼
頭部的元素is--遞減的 大小，移動你的頭了，而歸
無論這個元素。
這是完全有效的。
行。
我覺得這不是 像most--你不
要走出這裡 喜歡，是的，我知道嘗試。
我得到了這一切。
沒關係。
我保證。
但是數據結構的東西， 它需要大量的時間來用於獲得。
最難的可能是1 的東西，我認為，在使用過程中。
>> 因此，它肯定需要 重複和期待at--我
真的不知道鍊錶 直到我做了太多與他們，
在同樣的方式，我沒有 真正了解指針
直到我已經教了兩個 多年來，做自己的pset它。
這需要大量的重申和時間。
最終，它會有種點擊。
>> 但在此期間，如果你有實物 的高水平的理解什麼
這些幹什麼，他們的優點 和cons--這就是
我們真的傾向於強調， 特別是在介紹過程。
喜歡，為什麼我們使用 試試在一個數組？
喜歡，什麼是陽性 並且其中的每個的底片？
>> 和理解的取捨 每個這些結構之間
是什麼是更重要的現在。
可以有一個瘋 兩個問題那
要問你實現或推 實施POP或入隊和出隊。
但在大多數情況下，具有 更高層次的認識和更
一個直觀的把握是 比實際更重要
能夠實現它。
>> 這會是真的真棒，如果在座的各位 能夠走出去，去實現一個嘗試，
但我們知道它並不一定 最合理的事情，現在。
但是你可以在你的pset，如果你想 到，然後你會得到實踐，
然後也許你會 真正了解它。
是嗎？
>> 聽眾：好，那麼哪些是 我們的意思，在pset中使用？
我是否需要使用其中的一個？
揚聲器1：是的。
所以，你有你的選擇。
我在這種情況下猜測，我們可以 說說PSET一點點
因為我跑過這些。
因此，在你的pset，你有你的 選擇嘗試或哈希表。
有些人會嘗試 並使用布隆過濾器，
但這些在技術上是不正確的。
因為他們的概率性質， 他們給假陽性的時候。
他們冷靜地審視之中，雖然。
強烈推薦看 在他們最少。
但是，你有你的選擇 一個哈希表，並一試的。
而這將是哪裡 你在你的字典中加載。
>> 你需要選擇 您的散列函數
你需要選擇多少 鏟斗有，它會有所不同。
就像如果你有更多的桶， 也許它會跑得更快。
但是，也許你就是在浪費一個 很多空間的方式，雖然。
你必須弄明白。
Mmhmm​​？
>> 聽眾：你之前說 我們可以用其它散列函數
我們不必 創建一個哈希函數？
>> 揚聲器1：是的，沒錯。
因此，從字面上你的哈希函數， 像谷歌“散列函數”
並尋找一些很酷的人。
你是不是有望建成 你自己的哈希函數。
人一生 論文對這些東西。
>> 所以不用擔心構建自己的。
找到一個網上開始。
他們中的一些，你必須 操縱一點點
以確保返回類型匹配 及諸如此類的東西，所以在開始時，
我會建議使用一些 真的很簡單，也許只是
哈希的第一個字母。
然後，一旦你有工作， 結合有冷卻器的散列函數。
Mmhmm​​？
>> 聽眾：請問一個嘗試是或 高效而只是更難，like--
>> 揚聲器1：那麼一試，我想， 直覺是難以實現
但是非常快的。
但是，佔用了更多的空間。
同樣，你可以在優化這兩個的 不同的方式和有辦法to--
聽眾：我們怎樣分級的呢？
它matter--
>> 揚聲器1：所以你正常的分級方式。
你要對設計進行分級。
無論你的方式，你要 確保它的優雅，因為它可以
並作為有效的，因為它可以。
但是，如果你選擇一個試或哈希 表的，只要它工作，
我們很高興。
如果你使用的東西，哈希 第一個字母，這很好，
如可能喜歡的設計，明智的。
我們也到達 點這semester--
我不知道，如果你 球員noticed--如果你
PSET等級下降一點點 因為設計和諸如此類的東西的，
這是完全正常的。
它讓到一個地步，你 程序正變得越來越複雜。
還有更多的地方 你可以改善。
>> 所以這是完全正常的。
這並不是說你 您PSET做差。
這只是我們是很難對你現在。
所以每個人的感覺吧。
我只是分級所有pset中。
我知道每個人都感覺到了。
>> 所以不用擔心。
如果您有任何問題， 之前的pset或方法可以改善，
我嘗試了具體的意見 的地方，但有時它的後期
我累了。
是否有任何其他的東西 關於數據結構？
我敢肯定，你們真的不 要談他們了，
但如果有，我很高興 走過去了，還有什麼
講座從過去 上週，上一周。
>> 我知道，上週所有檢討， 我們可能已經跳過了一些檢討
從講座。
還有沒有其他問題我可以回答？
好了，沒事了。
好了，你們早出去15分鐘。
>> 我希望這至少是半很有幫助， 我會看到你下週的傢伙，
或週四的辦公時間。
是否有小吃請求 下週，它的東西嗎？
因為我忘了今天的糖果。
我帶過去的糖果 上週，但它是哥倫布日，
所以就像六個人誰 有四袋糖果的自己。
我可以帶星形圖案 再次，如果你喜歡。
星形圖案？
OK，聽起來不錯。
有一個偉大的日子，伙計們。