大衛馬蘭:好吧。 所以這是CS50,這是 現在3週的開始。 所以到現在為止,我們已經 在寫程序用C 這看起來有點 這樣的事情在這裡。 所以,我們有幾個 尖銳包括在頂部。 我們已經得到了詮釋,主要的,無效的,並 然後事情做在中間, 一些代碼位內 的該功能。 但重點一直事實 我們一直在說空在這裡。 因此作廢,這一切的時候,指定 這個程序在運行時, 只能通過其名稱來運行。 你不能輸入其他文字或 該程序的名稱時數後, 運行它。 因此,例如,如果節目是 編譯成一個名為hello的文件, 你可以做./hello,但就是這樣。 唯一的辦法,你可以 提供輸入到該程序 是通過調用一個函數。 例如,什麼功能 使用迄今還我們一直 以獲得來自用戶的輸入? 聽眾:獲取字符串。 大衛馬蘭:要獲得字符串,或 得到int或你見過其他人, 即使你沒有使用它們, 喜歡弄長,長,等等。 但是,假如我們 其實要開始 編寫程序是多一點 多才多藝,而且,坦率地說,多一點 就像你已經命令 已經越來越有希望, 有點習慣了。 如CD空間的Dropbox。 此,當然,改變 您的目錄,假設 你在約翰·哈佛的家 目錄到你的Dropbox文件夾。 同時,這樣的命令 創建一個名為pset2新目錄, 正如你可能已經或 很快就會在問題設置兩個。 當然,做出餵,是一個命令 即建立了一項名為招呼 從一個叫你好點C文件。 和在每個這些 的情況下,現在,我們已經有 在所謂的提供參數 命令行中,閃爍提示, 讓化妝知道要建什麼,等等 這MKDIR知道文件夾的創建, 和使坎德拉知道 您想去的地方。 但是到現在為止,我們一直在說 在主,您的默認功能, 有一個空洞的表達 這些括號內, 這意味著它 不帶任何參數。 所以,從今天起, 我們要做些什麼 是,我們要開始 支持這樣的事情,甚至。 事實上,在這種情況下,你 通常不手動輸入, 讓一直在做這 對我們來說,有沒有 之一,但一個,兩個,三個附加 之後,該程序的命名字符串 鐺。 那麼,如何才能做到這一點? 好了,從今天開始, 在這裡我們要案件 通過提供輸入 所謂的命令行 我們要開始添加 這裡什麼在yellow-- 與詮釋的argc逗號代替無效 字符串argv的左括號右括號。 現在,這是有趣的 一對夫婦的原因。 一,這將讓我們寫 程序是多了幾分動感。 不過,更令人信服, 這將打開 現在的對話,以 什麼陣列可真 可以使用,什麼串 真的是引擎蓋下方, 等到下星期我們開始跳水 在更深層次,以機器是如何 讓所有這些東西的工作。 但現在,讓我們來畫, 也許,一個圖片。 當你寫一個程序 與主聲明 以這種方式,使得主 有兩個參數,一個int 還有 - 什麼樣的數據類型 是第二個參數? 聽眾:陣列。 大衛馬蘭:陣列。 所以,第一眼看上去就像是一個 字符串,但要注意的方括號。 還記得我們去年推出的時間 陣列的概念。 和數組使用方括號 在幾個場合。 您可以使用方 括號去到一個數組 並獲得一個特定的元素,如 支架0或1架或支架2。 但是我們看到,如果簡單地說, 上週,你也 使用這些方括號 聲明數組的大小, 如果你事先知道有多少個整數 或者有多少字符串或任何你 其實想。 因此,原來有 這裡三分之一的上下文 這裡面有沒有一些 方括號。 當你指定,因為我這裡有, 的類似的argv名稱, 這只是一種奇特的方式 話說參數向量,這 是另一種奇特的方式 說的參數數組, 開放式托架右方括號只是 意味著你不一定 預先知道有多大 該陣列將是, 但你知道這將是一個數組。 所以,如果你不知道的 一些不把它放在那裡, 開放式托架右方括號 也就是說argv是不是一個字符串, 但一個字符串數組。 所以,語法,如果你 回想上週, 這是非常相似的說法 像整型年齡開支架, 再以後的東西。 那麼,這是什麼樣子的呢? 讓我們來實際繪製的圖片。 所以,當你運行這個程序有主 有兩個參數中定義 這些括號的,你 本質上具有至少兩個組塊 內存就交給你了 引擎蓋下方。 一,我會為繪製這個矩形, 將要被調用的argc。 而只是作為一個快速回顧一下, 什麼是ARGC的數據類型? 所以這是一個int。 因此,一些會 走在argc--圈 出代表參數計數。 同時,我畫的argv為數組。 我真的不知道 多久將是, 所以對於今天的目的,點點點。 它可能會得到一些長度。 但我在這裡想像 至少四個矩形。 所以的argv內存存儲塊 串串串點點點, 和ARGC只是一大塊 的存儲器為一個整數。 所以,現在,讓我們可以更確切的一點。 如果,當我有串 在這個數組,稱為 ARGV,我想向他們 單獨的,就像上​​週, 我們將要使用的符號 像argv的支架0 拿到的第一件事數組。 ARGV支架1得到 第二件事情,等等。 這裡的關鍵是,我們還在0 indexed--我們仍然從0開始計數。 所以,現在讓我們來實際 裝上去的。 如果我要編譯一個調用程序 你好,從一個叫你好點C文件, 然後我運行的程序 用點斜線您好, 什麼我的電腦,我的筆記本電腦, 像機罩下方 那一刻我跑點 濕地打招呼,敲回車? 那麼,這也許是 我們可以描述 為您的計算機的內容 存儲器,或RAM--隨機存取存儲器。 換句話說,計算機 不知怎麼給你神奇, 放入的argc數字1,AKA argcount, 它把字面上的字符串 ./hello argv中支架0。 我不知道,坦白地說,有什麼 argv中托架1或2或3, 因為如果用戶具有不 什麼類型除了./hello, 我們將假定這些 最有可能的垃圾值 可以這麼說。 內存塊的那些 存在的,但它不是我們 看著他們,因為 該argcount是唯一的一個。 現在,同時,如果我 編寫運行另一個程序, CD,這是更適當的命令時, 在你眨眼prompt-- CD的空間 當我運行,有效地Dropbox--, 光盤程序運行時,argc個, 我的計算機的內存裡面,是 最簡短的第二數字2。 然後argv的支架O具有 CD,argv的支架1有Dropbox的, 然後當然命令 完成,所以這一切的記憶 基本消失, 用於別的東西。 這就是為什麼我說 只是一個瞬間。 同時,如果我們做的mkdir pset2, 畫面看起來幾乎一樣, 但裡面的argv不同的字符串。 如果我做鐺衝刺打招呼 你好點C,同樣的想法。 更多的東西填充的 的argv和argc個,當然,是4。 因此,換句話說, 儘管這陣 可能會點一些點點, 可變長度的,可以這麼說, 你總是知道它在哪裡結束 是的,因為的argc是要告訴你 在什麼時候你必須停止 看著argv中的元素。 你只能看4 在總在這種情況下。 現在讓我們來看看, 也許,一個簡單的程序。 一個剛剛打招呼 到有人喜歡Zamyla。 所以,我要求我要編寫一個程序 在短短的一瞬間,通過它我可以做 ./hello空間Zamyla,然後我想 我的程序打印出來的東西 超級簡單的像“你好,Zamyla。” 現在,在過去,我們使用的GetString。 因此,在過去,即使 你是新來編程, 可能你會掀起 使用GetString的程序 然後使用printf的 說喜Zamyla。 但是,我們不要用GetString的這個時候。 讓我來代替進入Appliant 做包括標準輸入輸出點小時。 讓我也有CS50網點小時。 現在主要的詮釋,而現在我 不會今天做無效。 相反,我該怎麼辦INT ARGC 字符串的argv開括號右括號, 不指定一個數字。 喏,這就是我所謂的做。 我什麼都現在要做的就是,我 打算做一點信仰的飛躍, 我將假設用戶的 要正確地使用這個程序, 而我只是去 這樣做的printf你好,%錫。 所以,沒有什麼新的存在。 但我想現在把什麼字 該程序的名稱後,用戶類型。 所以,如果我這樣做./hello空間Zamyla,我 要以某種方式編程方式訪問 報價引文結束“Zamyla。”所以我 可以進入我的參數向量, 我的字符串數組,並且如果該命令 再次,是./hello空間Zamyla, 什麼數字做我想要 argv中放這裡? 聽眾:1。 大衛馬蘭:1,因為 支架0證明 將是該 節目的名字,正如我們所看到。 所以托架1是第一個字 我的用戶,鍵入。 我要繼續前進,保存這個。 我要進入我的文件夾 在那裡我已經放在這個文件。 我該怎麼辦讓你好3。 比較IO的確定。 ./hello Zamyla輸入。 我做了什麼錯? 我措手不及 我自己只是一瞬間出現。 我做了什麼錯? 聽眾:名稱。 大衛馬蘭:該文件的 其實所謂的hello3.c。 我這樣做只是為了 一致性,因為我們已經 有hello.c中的中 過去在聯機代碼。 因此,讓我們解決這個問題./hello 支架衝刺3 Zamyla。 輸入。 現在我們有打招呼,Zamyla。 同時,我可以改變這 是搶,還是真的任何其他文字。 但是,讓我們考慮一個角落的情況下。 什麼,你可能會想到,如果會發生 我不輸入任何人的名字呢? 聽眾:錯誤。 大衛馬蘭:錯誤 的一些,也許。 讓我們來看看。 輸入。 NULL。 所以printf的實際上是被 一點點保護我們 在這裡,和字面移印開括號 空,但更糟糕的事情都可能發生。 而只是為了展示 東西你絕對 不該做的事,讓我們在 在這裡,並開始閒逛。 對不對? 如果我知道,在畫面 內存基本上是這樣, argv的支架1具有Zamyla,ARGV 托架0具有./hello,或./hello-3。 什麼是支架2? 這樣我就可以回答這個問題 懷疑自己,對不對? 我只能改變1到2。 我現在可以重新編譯您好3, ./hello3讓我們放大並按下回車鍵。 哎呦。 沒有引號。 有意思的。 所以這是一種很酷 看到的是在這裡還有什麼。 那麼,我的筆記本電腦裡還有什麼? 讓我們將它保存與支架3。 請hello3,./hello-3。 好奇的。 現在,讓我們真正bold-- 50。 所以,這真的跳水深 進入我的電腦的內存中。 50指數研究。 所以要餵3 ./hello-3。 好奇的。 好吧,現在我只是 要得到魯莽。 讓我們去到5000。 好吧。 因此,讓我重新編譯。 請hello3,./hello-3。 行。 現在,你們中的一些,可能 一個燈泡去了。 你們有多少人有 之前看過這個消息? 行。 那麼,為什麼呢? 賠率are--並有不同 事情可能會導致此, 並明確你的好 company--我們必須清楚 造成了所謂 分段故障。 而長話短說今天,我 已經觸及記憶的片段 我不應該有。 其中段僅僅意味著一大塊 記憶,我不應該有。 現在的電腦可以保證,如果我 運行./helloZamyla我能觸摸的argv 是支架0和argv支架1。 但ARGC是值2,這意味著我 只有allowed--這有點榮譽 系統 - 觸摸 0支架及支架1。 如果我再往前走,有 絕對將是存儲器那裡。 我的內存物理上存在 在計算機中。 但誰知道那裡有什麼? 事實上,我在運行多個 程序在同一時間。 我可能有seen--如果我不 在Appliant這樣做 但在我的Mac或PC--我可能有 觀察的電子郵件的內容。 我可能會看到瞬間 消息我最近發。 任何可能 在內存周圍徘徊 可以通過的方式被訪問 這個任意方括號。 或者,更糟糕的是,你可能有 發現了我的密碼1 我想最近輸入的,一個 方案已存儲在內存中,從而 驗證了我, 然後種剛剛離開它 在內存中,直到我退出該程序。 事實上,這是一 的危險,一個權力 使用類似C的語言 您可以自由訪問 到的全部內容 程序的內存, 什麼壞人能 即使在做這些cases-- 特別是當我們 得到Web編程 朝學期結束,我們將 重溫這topic--是閒逛, 可能有人是電腦的 記憶,找到這樣的事情感到好奇 因為我們看到了那裡。 甚至更糟糕的是,口令,他 或者她可以用它來幹壞事。 所以,顯然我不應該這樣做, 因為奇怪的事情開始發生。 的確,這是一個程序崩潰。 這將是等效 的Mac OS的Windows或 程序窗口剛剛消失。 已發生未預期的錯誤。 在命令行環境 我們看到這樣的事情。 但是,這是為什麼,是我只是碰 不屬於我的記憶。 因此,讓我們對這樣的防守 以不同的方式點點 通過看這個節目在這裡。 因此,再次,骨架 我們看到先前已經 我已經強調了這一次詮釋。 而這一切的時候主要有 實際上返回的值。 即使在我們大部分的演講 我們從來沒有使用一次例子 返回主任何東西。 我們只是寫的printf關閉 大括號,就是這樣。 但對於自由,什麼 編譯器已經做了你, 有效,則返回0給你。 打開out--,它是一個小 counterintuitive-- 0是好。 這並不意味著錯誤本身。 0是好,任何非0 值時,世界已經決定, 可以表示一個錯誤。 所以,如果你曾經搞砸 什麼您的計算機上, 或計劃剛剛去世,你和 你已經得到了一些錯誤窗口 在屏幕上,說錯誤 負49或錯誤23-- 一些看似隨意的value--這 因為程序員已經硬編碼 像49負或正的值 23代表任意數字,敢說, 四十億可能的事情 可能出錯的程序。 所以,我怎麼可能拿 利用這一點我自己? 好吧,讓我打開一個程序 我提前寫了, 和閒逛在線名為hello 4。 這幾乎是相同的,不同之處在於 它得到了錯誤檢查的一點點。 在這種情況下,我再次聲明 主要是考慮兩個參數, 但是這一次,在第17行,通知 我做了一下仔細的檢查了。 我要確保 的argc等於等於2。 因為如果是,那 意味著我可以安全地 觸摸不僅托架0,但是支架1。 我繼續前進,打印出來, 在這種情況下,Zamyla或搶劫 或什麼字我打出來。 而現在只是為了讓 多一點正確的, 我要明確地返回 0來表示一切都很好。 沒什麼不好的事情發生了。 不過,按照慣例,我要 返回1,或者坦白任何非0值, 如果出事了。 現在,用戶不會 真正注意到發生了什麼事情。 事實上,如果我進入這個目錄, 我們放大,做讓你好4, ./hello-4 Zamyla表現如我所料。 但是,如果我不是不鍵入 什麼,似乎什麼都沒有發生, 但它不會崩潰。 如果我不是做一些事情 像羅布是一個監考人 在Thayer--共享 任意信息。 但通知,argv的1,2,3,4,和 5現在應該存在於內存中。 這也並不是什麼 我的程序需要, 因為我已經檢查是否 的argc等於等於2或沒有。 所以,我現在防禦這一點。 現在,順便說一句,我們的 programmer--或者說我們的users-- 從來沒有看到一個0或1,但使用 工具,稱為調試器或其它工具, 和以前一樣,我們會看到 長,你的程序員 其實可以看看可能是什麼 你的程序裡面去錯了。 因此,在ARGC什麼問題嗎? 是啊。 聽眾:我見過他們 還沒有的字符,[聽不清] 剛才說的串星D,如 字符星號逗號。 他們是等價嗎? 大衛馬蘭:他們是。 所以,問題是,你有 偶爾可見的程序 像這樣不 說字符串argv的支架 而是說些什麼 像炭明星argv的支架。 甚至還有其他 變體,你可能會看到。 他們確實是等價的。 現在,我們有這些 這類訓練車輪 在字符串中的CS50的形式 庫,但在短短一個多星期 還是讓我們將刪除 完全梗阻,實際上 看看炭和星 有,以及這些涉及到內存 代表更普遍。 因此,我們會回來的。 在我們的argv和argc個其他的問題嗎? 是啊。 聽眾:為什麼會回來 錯誤[聽不清]? 大衛馬蘭:為什麼會 返回一個錯誤only--哦! 在前面的情況下,當我們 帶記憶功能均圍繞把玩, 為什麼只返回一個錯誤 當我真正輸入一個大數目? 簡短的回答是,我們只是很幸運。 一般來說,一台計算機 在塊分配內存, 它給了我一個足夠大的存儲塊,它 我得到了,而不被發覺, 感人的支架2,支架3, 支架50,但只要我推 我的運氣,我去超越 的存儲器中的數據塊的邊界 操作系統給了我。 這就是當 取締並說,沒有。 分割錯誤。 是啊。 聽眾:如何在電腦 知道的argc的值? 大衛馬蘭:請問該如何 計算機知道的argc的值? 當你運行一個程序,該程序, 通過閃爍提示性質, 被傳遞的數組 被輸入的字 在提示符下,這是 鍵入的。 因此,這是你的工作 系統的本質 填充主要的論點為您服務。 所以這是一個服務 之類的,你得到的,偷偷的 的機罩下方 一個操作系統。 其他問題嗎? 是啊。 聽眾:什麼是核心轉儲是什麼意思? 大衛馬蘭:這是什麼核心轉儲是什麼意思? 所以這是一個很好的問題。 讓我重新回到 該目錄在這裡。 而且你會發現, 我有一個新的文件存在。 它確實是叫核心,它的 其實通常一個體面的大小的文件。 這是本質上的快照 我的程序的內存內容 或RAM時墜毀。 並且這將是有用的, 可能,診斷, 當我們談論在未來的演講 而有關調試部分, 因為你實際上可以做的 數字屍檢相當於 在該文件中,以幫助找出 你做錯了什麼在你的程序。 是啊。 聽眾:是的argc的命令 本身,或者你的名字什麼? 大衛馬蘭:好問題。 是的argc命令本身, 或者你能想到的東西嗎? 這絕對不是一個命令。 這是一個簡單的變量 命名或參數的名稱, 所以,我們絕 可以稱之為富, 我們可以把這個吧,這往往 是去到的話,一個計算機 科學家去。 但按照慣例,我們用argc和argv。 但是,這只是一個人 按慣例,僅此而已。 好吧。 所以,事實證明,我已經 講述一個有點白lie--的 坦率地說,在未來,你會看到 我們已經告訴其他善意的謊言。 但現在,我們要 剝離背部的其中之一。 在這種情況下這裡的時候,我在前面 跑起來像./hello或./hello-3方案 Zamyla,我們有內容我 計算機的內存期待大致如下 這個。 但是記得什麼是字符串。 咱們怎麼說的一個星期前有什麼 字符串實際上是引擎蓋底下? 聽眾:字符數組。 大衛馬蘭:這是一個 字符數組的,對不對? 因此,我們可能有一個數組 字符串,但是,反過來,一個字符串 是字符數組。 所以,如果我真的想成為 當我畫這幅畫的肛門, 我真的畫 它有點像這樣, 由此在每個這些 我argv數組的索引, 存在本身就是一個整串 這本身是一個數組。 現在的善意的謊言 我們今天講 就是圖片不 看上去很喜歡這個。 事實上,小廣場都是 一般外面的大矩形 那裡。 但我們會回來用不了多久。 但是,這是./hello反斜線0, 這是特殊字符 劃定一個字符串的結尾, 我們已經得到了一個又一個後 Zamyla的名字。 所以,這是什麼意思? 好了,讓我繼續前進, 打開另外兩個例子 這是在網上提供。 一個被稱為argv1.c 另一種是argv2。 這是一個超級簡單的程序, 與過去不同的方案 在現在,我使用 argc和argv在這裡。 現在我有一個for循環積分 在長達argc那樣線18,從i = 0。 而且我怎麼辦 與這行代碼在這裡? 用英語。 這顯然表明使用的argc的。 但在英語有哪些呢 它這樣做,如果我運行這個程序? 是嗎? 聽眾:這將打印 只要你想篩選多次。 馬蘭大衛:沒錯。 所以,無論話我 在提示符處鍵入,它的 要吐出 他們看著我,每行一個。 因此,讓我們繼續前進,做到這一點。 讓我進入我的目錄 做讓argv1 ./argv1。 現在,讓我們保持簡單。 讓我們什麼也不做第一。 它沒有打印出一件事, 這是確實的程序的名稱, 因為這是在支架0。 如果我現在說富,它會做 這兩個,如果我說富吧, 它會說,這三樣東西。 現在,這是有點有趣,也許。 但記得的argv 是一個字符串數組, 但字符串是字符數組, 所以我們可以拿東西了一個檔次 並應用基本 邏輯,使代碼 看起來多了幾分神秘,無可否認。 但是,有一個嵌套 循環的東西,類似於 什麼,你可能還記得馬里奧, 舉例來說,如果你這樣做,是這樣的。 所以現在看到第19行,我 再次遍歷我的論點, 從0一直到argc那樣。 現在的行21--我 借用去年week--一招 我檢查什麼 長的argv支架I的。 我存儲在正的答案。 然後我從J於一體 到n,其中j被初始化為0。 所以,約定計算。 一旦你使用了我,如果你有一個 嵌套循環,不能再次使用I, 否則你會揍,潛在的, 內環以外的值。 所以我用j通過約定。 我們可以使用k。 如果你比k的多了,你可能 有太多的嵌套,一般。 但現在,我發現的printf 線是略有不同的。 我不打印%S,我 當然,印刷%C,其中, 是一個佔位符字符。 現在看到這個語法。 新。 我們以前沒有見過。 但在邏輯上,這也就意味著 獲得argv中第i個字符串 並獲得第j個什麼? 聽眾:字符。 大衛馬蘭:字符的字符串。 所以可以用方括號 其次是方括號, 這是第一次跳水 進入ARGV的字符串, 然後將第二 方括號內為J 是在深入的字符 argv中的特定字符串。 然後,只為好措施, 我打印了新線在這裡。 所以,現在讓我繼續前進,開 一個稍微大一點的窗口 所以我們可以看到這個動作。 讓我進入該文件夾。 現在做讓argv中,2-- whoops--作出的argv-2,./argv 2。 輸入。 這是一個有點硬 垂直閱讀, 但是這確實是名 程序,其次是一個空行。 現在讓我繼續前進,做富。 同樣難讀,但它的 的確打印每行一個字符。 如果我去做吧,這是現在 打印這些一行行。 因此,這裡的外賣是沒有這麼多 ,哇,看這整齊的新把戲 在那裡你可以在內容獲取 的陣列的特定字符, 而是如何我們正在採取這些基本 這樣的創意索引到一個數組中, 然後索引到一個 數組是數組, 而在應用了同樣的想法, 稍微複雜的例子。 但基礎實在不 改變,即使是自上週以來。 現在,這是有點及時, 在那,記得,零一周 我們打了一個電話本這樣。 即使這是明顯 物理的紙片, 種你能想到的 電話簿為一個數組。 當然,如果你要重新實現 這件這些紙片 在一台電腦,可能 你會使用的東西 像一個數組來存儲所有這些 從A一路姓名和電話號碼 到Z所以這是很好的,因為 它讓我們有機會, 也許,要考慮你怎麼可能 真正實現類似的東西。 由於有一系列的門這裡。 所以,如果我could--我們需要一個 自願到來吧。 讓我們來看看。 一個陌生的面孔也許, 陌生的臉也許。 怎麼樣在橙色? 這裡。 橙色的襯衫,上來吧。 現在,讓我們和舉措繼續 這些門上的側 將這些閃開了一會兒。 你叫什麼名字? AJAY: 大衛馬蘭:阿賈伊。 大衛。 很高興認識你。 好吧。 因此,我們有這六個背後 門數字上screen-- 或者說,七門上 screen--一大堆數字。 我已經告訴你什麼 在advance--同意? AJAY:事先沒有。 大衛馬蘭:我只想要你做 現在是時候找到我,對我們來說, 真的,數量50, 一步一個腳印的時間。 AJAY:50號? 大衛馬蘭:數字50。 而且你可以發現什麼 後面這些門 只需用手指觸摸它。 該死的。 [笑] [掌聲] 非常出色。 行。 我們有一個可愛的禮物 獎你在這裡。 你挑的電影,我們 上週討論。 AJAY:哦,伙計。 哦,我從來沒有見過太空砲彈。 大衛馬蘭:太空砲彈。 好吧。 因此,堅持只是一個瞬間。 How--讓我們做這個 受教moment-- 你怎麼去 尋找50號? AJAY:我選擇了隨機。 馬蘭大衛:所以你選擇了 隨機真的很幸運。 AJAY:是的。 大衛馬蘭:確定。 優秀的。 所以,現在,你有沒有 得到幸運的話,還有什麼 可能發生背後的門? 所以,如果我繼續前進, 這裡透露這些數字, 他們實際上是在隨機順序。 而最好的,你可以有 完成後,坦率地說,是,最終, 在最壞的情況下,檢查了他們。 所以,你有超級幸運的,這 是不是我們所說的算法。 是的,恭喜。 但現在let's--幽默我,如果你能。 讓我們在此選項卡在這裡。 這裡是明確的數字 似乎是隨機的順序, 而且他們。 但現在,如果我不是索賠 這背後的門 是被排序號碼。 現在的目標是要還 找到我們的數50。 但這樣做算法上,而 告訴我們你要去了解它。 如果你找到它,你把這部電影。 你不覺得,你給它回來。 AJAY:所以我要去檢查結束 首先,確定是否there's-- [笑聲及掌聲] 大衛馬蘭:在這裡你去。 讓我們來看看1 Ajay的前輩, 肖恩,誰是沒有那麼幸運了。 好了,你在這裡的任務, 肖恩,是下面的內容。 我隱藏在這些 門七位數, 但在一些宗門藏 以及其他的非負數。 你的目標是要想到這 號的最上一行作為僅有的陣列。 我們是件只是一個序列 紙與他們背後的數字。 你的目標是,只有使用頂部 陣這裡,我找了七位數。 我們隨後將要批判 你如何去這樣做。 找到我們七位數,請。 號 5,19,13。 這不是一個腦筋急轉彎。 1。 在這一點上你的分數不是很 好,所以你還不如繼續下去。 3。 去。 坦白說,我不禁懷疑 什麼你甚至想。 肖恩:我可以只從最上面一行。 大衛馬蘭:只有最上面一行。 所以,你有三個左。 所以找我7。 [聽眾呼喊幾點建議] 因此,這兩個都是驚人 非常不同的原因。 所以這是我們 離開片刻前, 這裡的關鍵洞察力 在這些門有號 在他們身後被整理的,理想的 外賣的是,你可以做 在根本上更好 本次example-- 而事實上,這是肖恩的 第一次嘗試用隨機數 正如before--但只要 作為這些數進行排序, 像電話簿, 你能很明顯嗎? 或者,你如何利用這些知識? 是啊。 聽眾:你走到半路[聽不清]。 馬蘭大衛:是啊。 沒錯。 所以Ajay的初始反應是 檢查結束後,我記得, 然後排序,我們完成 這個例子很快。 但是,如果我們開始做這個多 有條不紊地沿著這些線路, 但是,在可能開始 中間,因為他們排序, 只要我們揭示 16號,所以我們知道 - ,讓我們做的正是that--我們 因此,知道50,在今天的情況下, 已經該殺到右側。 所以,就像在零一周時 我們在半撕電話簿 扔一半 的問題了,在這裡同樣的想法。 我們可以拋出這個半 這個問題了。 也可能是你 可能會做算法上, 一旦你知道,50必須 在正確的,如果它的任何地方, 是嘗試在那裡,在中間 的其餘的門。 當然,圖50是高 超過42,所以我們可以 拋出這個剩餘 四分之一的問題了, 並且,最後,確定 像50。 但是,就像用 電話簿,這些數字 在給予我們已經 有序,這給我們留下 有問題,你怎麼了 得到的東西進入的排序順序? 而且,坦率地說,代價是什麼? 這是一件事是 遞給電話簿 然後通過找到打動你的朋友 電話號碼真的很快,對不對? 撕裂32頁開始尋找 人出四十億的網頁, 我們說的是一個極端的例子。 但是有多少時候都不需要 Verizon公司進行排序的電話簿? 它沒有多少時間帶我們 這七個數字排序? 這是我們一直的問題 迄今完全忽略。 現在讓我們回答這個問題。 而且我們都出電影了, 但是我們確實有一些壓力球。 如果,比如說,8名志願者 不介意加入我們了嗎? 讓我們繼續做,怎麼樣 你們四個,你們三個在這裡? 得到一些新的面孔。 和你們四個有? 和now--我們不要偏見這裡 - 和 數字8在這裡就完了。 上來吧。 好吧。 所以,我們在這裡為 你們每個人是一個數字。 如果你想去 未來,拿這個號碼。 你叫什麼名字? ARTIE:阿蒂。 大衛馬蘭:阿蒂,好吧。 你是1號。 阿明:阿明。 大衛馬蘭:阿明。 大衛。 你是2號。 並繼續前進,因為我的手 你的紙的片材, 排隊了自己在音樂面前 站在相同的順序在那裡。 安迪:嗨,安迪。 大衛馬蘭:安迪,很高興見到你。 3號。 雅各雅各。 大衛馬蘭:雅各,4號。 歡迎登機。 格蘭特:格蘭特。 大衛馬蘭:格蘭特。 號碼5。 ALANNA:Alanna。 大衛馬蘭:Alanna,6號。 FRANCES:弗朗西斯。 大衛馬蘭:弗朗西斯,7號。 和? RACHEL:瑞秋。 大衛馬蘭:雷切爾,8號。 好吧。 來吧,讓自己在這個秩序。 讓我把剩下的一個 樂譜架的地方。 你在哪裡需要一個立場? 行。 來吧,只要把你的號碼 那裡的觀眾可以看到他們, 在樂譜架朝外。 並希望,我們的第一個 完整性檢查這裡 - 4,2,6。 哦,哦。 等待一分鐘。 我們沒有8。 我需要從你驅逐 這個例子莫名其妙。 號 不,沒關係。 讓我們來看看。 我們可以做到這一點。 支持。 我們走吧。 正確。 好吧。 所以,現在我們有8個,1,3 7 5。 行。 優秀的。 因此,目前的問題是,在 什麼樣的代價,並通過什麼方法, 可我們實際上這些數字在這裡進行排序 所以那種認為我們可以倒推, 最終,和decide--是不是真的 令人印象深刻的,是不是真的有效, 我可以分裂, 征服電話簿? 是不是真的有效了 我可以分而治之 這些數字件 紙在黑板上, 如果,也許這將花費我們 發跡於時間或精力或CPU週期 真正讓我們的數據 成一些有序? 因此,讓我們問這個問題。 所以,首先,這些數字都是 在幾乎隨機的順序, 而我要建議 一種算法或過程 通過它,我們可以將這些人進行排序。 我要去接近 這個漂亮的天真。 我要去認識 這是種了很多對我來說 環繞在我的腦海 全部數據設定為一次。 但是你知道嗎? 我要做出一些 很簡單的邊際修正。 4和圖2是不按順序,如果 目標是從1到去多達8。 所以,你知道嗎? 我要擁有你 球員交換,如果切換 物理位置和 您的紙片。 現在4和6,這些都是為了。 我要離開的是。 圖6和8中,那些符合規定。 要離開他們是。 8 AND1,亂序。 如果你們兩個不會介意交換。 現在8和3,如果你們可以交換。 8和7,如果你們可以交換。 8和5,如果你們可以交換。 現在,我是不是做了什麼? 不,顯然不是。 但我所做的 情況較好的,對不對? 什麼又是你的名字,8號? RACHEL:瑞秋。 馬蘭大衛:所以瑞秋有 有效地冒泡很遠, 一路的端 我的數字陣列在這裡。 所以這個問題是種解決。 現在,很明顯,2仍需要 動了一下,4和6和1。 但我似乎已經獲得了 更近些的溶液。 因此,讓我們應用同樣的 天真的啟發式一次。 2和4,確定。 4和6,確定。 圖6和1,毫米毫米。 讓我們來交換。 圖6和3,毫米毫米。 讓我們來交換。 6和7就可以了。 7和5,沒了。 讓我們來交換。 現在圖7和8。 而你叫什麼名字來著? FRANCES:弗朗西斯。 大衛馬蘭:弗朗西斯。 所以,現在弗朗西斯是,即使一個更好的 位置,因為現在7和8 正確鼓泡到頂部。 因此,2和4,確定。 4和1,我們交換。 4和3,讓我們交換。 4和6,你真行。 6和5,讓我們交換。 而現在那些傢伙都不錯。 我們快到了。 2和1,亂序,所以交換。 現在讓我做一個全面的檢查。 圖2和3,圖3和4,圖4和 5,5和6,6和7,8。 好了,我們就大功告成了。 但代價是什麼沒有我 這些數字在這裡進行排序? 那麼,有多少步驟可能我做 整理這些人的時候走? 好了,我們會回來的問題。 但是,坦率地說,如果你有 有點無聊,這是 種揭示,這是不 也許是最有效的算法。 事實上,坦率地說,我出汗 更來回走動。 這並沒有覺得特別有效率。 因此,讓我們試試別的。 如果你們能重置 你們這八個值。 好工作。 讓我們來看看數字,對於剛 片刻之前,我們嘗試別的東西, 在剛剛發生了什麼。 在這裡,你即將看到一個 這八人的可視化 由此藍色和紅色 線表示數字。 該高了吧, 更大的數目。 酒吧越短, 數字越小。 而且你會看到什麼是在 隨機順序當中超過八人。 你會看到這些酒吧 越來越排序方式是相同的算法, 或指令集,其 我們會打電話給今後冒泡排序。 所以請注意,每一秒左右, 兩個酒吧都照亮了紅色, 由計算機進行比較。 然後如果大條和 小酒吧是亂序, 他們被交換給我。 現在,這是令人難以置信的繁瑣 看這個,當然, 很長,但要注意的 takeaway--大條向右移動, 小棒移動到左側。 讓我們來終止這個進程 並加快這 要快很多,所以我們可以 得到一個什麼樣的高層次感, 的確,冒泡排序在做什麼。 事實上,它的向上冒泡到 列表中的右手側, 或陣列,更大的酒吧。 反之,小酒吧 鼓泡的方式,以左, 雖然以更快的速度 比我們以前做了。 因此,很難看到人, 但在視覺上這確實是 正在發生的事情。 但是,讓我們嘗試從根本上 不同的方法了。 讓我們嘗試不同的 算法即能滿足您 球員開始在這些原 位置,這是這個順序在這裡。 而現在讓我們繼續。 而我要做的事 即使是簡單的,對不對? 現在回想起來,再兩兩交換 又一次,幾乎是小聰明。 讓我們做事情更天真, 在那裡,如果我想這些人進行排序, 讓我繼續找 為最小的元素。 所以現在,4是 最小號我見過。 我要記住這一點。 不,2是更好的,記住這一點。 1更小。 3,7,5。 行。 埃德蒙頓你叫什麼名字來著? ARTIE:阿蒂。 大衛馬蘭:阿蒂。 因此,阿蒂,勇往直前。 我要拉你出來就行了。 如果你能回到這裡來。 我需要騰出空間給他。 我們有一個決策點這裡。 怎麼可能,我們騰出阿蒂這裡 在其中1號所屬的開始? 聽眾:移位。 大衛馬蘭:好了,我們 可能會改變每一個人。 但提出了一個優化。 這感覺有點惱人 我要問四人 一路向下移動。 我還能做什麼? 聽眾:切換。 大衛馬蘭:切換。 而你叫什麼名字來著? 雅各雅各。 大衛馬蘭:雅各移動。 更高效只需要有 與阿蒂雅各互換位置, 而不是迫使 這些人的所有四個, 非常感謝你,給 其正確的位置。 有什麼好的關於阿蒂現在, 他在他的正確位置。 讓我們再次做到這一點。 2,這是最小的數字我見過。 3,7,5。 行。 2,絕對是最小的。 沒有做任何工作。 讓我們再做一次。 6。 最小? 8。 不。 4? 哦。 我記得4。 3。 我記得3。 7,5。 最小的數字我已經 看到這一關就是3。 如果你會來上了。 我們去哪兒把你嗎? 而你叫什麼名字? ALANNA:Alanna。 大衛馬蘭:Alanna,我們 不得不趕你。 但是,這是更有效的, 只是換了兩個人, 比有多人 實際上迴避了。 現在,讓我們再次做到這一點。 我會選擇4,所以就來了。 和誰去動? 8號,當然。 如果我現在發現5號,拜託了。 8號會得到再次驅逐。 我現在要去找到位數6。 7到位。 8就位。 我們剛才所做的是 一些所謂的選擇排序, 如果我們想像這一點,它的 會覺得有一點不同。 讓我們繼續前進,從這個 菜單在這裡,這visualization-- 讓我們改變這個to--來吧,Firefox瀏覽器。 讓我們改變這個選擇排序。 讓像以前一樣的加快步伐, 現在開始的可視化。 該算法具有 不同的感覺。 在每次迭代中,坦率地說, 它更簡單。 我只是選擇的最小元素。 現在,坦率地說,我有點幸運, 時間,在它的排序超快。 這些元素是隨機的。 這不是,因為我們最終會 看,根本快。 但是,讓我們看到了第三次也是最後 此方法,因為要發生的事情。 因此,讓我們繼續前進,重新你們 一最後一次是在這裡這個順序。 而現在,我要 有一點更聰明, 只是圓了我們的算法。 我會做到這一點。 我會不會去 來回這麼多。 坦率地說,我已經厭倦了 這一切的穿越。 我只是要帶什麼,我 在列表的開頭給出 我要去排序 那,然後有。 所以,我們在這裡。 4號。 我要插入數 4成排序的列表。 完成。 我現在聲稱,只是讓這個更 顯然,這部分我的列表進行排序。 這是一種愚蠢的索賠,但確確實實 4是按尺寸1的列表。 現在,我要承擔數2。 2號,我現在要 插入到合適的位置。 那麼,這是否屬於2? 顯然,在這裡。 所以,儘管回遷,如果你能。 而為什麼你們不只是把 你的音樂代表了你這一次。 而且,我們強行插入您 到列表的開頭。 所以,更多一點的工作。 我不得不提出雅各布身邊, 而你叫什麼名字? 阿明:阿明。 大衛馬蘭:阿明。 但至少我沒有去來回。 我只是以事,我去。 我只是將它們插入 在正確的地方。 6,其實這是很容易的。 讓我們將你在那邊,如果你 只是想稍微移動了。 8號,也非常的方便。 就在那邊。 該死的。 1號,我們不能只 與阿明在這裡交換, 因為這是怎麼回事 亂了秩序。 因此,我們要多一點聰明。 因此,阿蒂,如果你能 備份了一下。 讓我們繼續前進,現在轉移, 不像我們以前的算法, 讓路給阿蒂 這裡開頭。 所以,在這一天結束時,我種 做什麼,我想避免之前。 所以我的算法排序 逆轉,智, 從它最初是什麼。 我只是在做轉移 在不同的點。 現在,我在3。 哦,該死的。 我們必須重新做更多的工作。 因此,讓我們推你出去。 讓我們繼續前進8,6,4--哦oh--和 3是要去那裡。 所以至少略有節餘這個時候。 7,沒有太多的工作要做。 所以,如果你想彈出 回來了,讓我們來插入你。 最後,圖5,如果你 想彈回,我們 需要轉向你,你, 你,直到5到位。 所以,現在看到了這點 高水平的圖形, 讓我們做這個算法 可視化的一個額外的時間。 所以這個我們稱之為插入排序。 我們會運行它就像 快,從這裡開始吧。 而且,也有不同的感受。 這有點越來越好, 好,但它從來就不是完美 直到我走在光滑的這些差距。 因為,同樣的,我只服用了 我正考慮由左到右。 所以,我沒有那麼幸運了 這一切都是完美的。 這就是為什麼我們有這些小 我們在固定的時間mispositions。 因此,所有這些算法似乎 在略微不同的速度運行。 事實上,你想說的是 最好的或迄今最快? 冒泡排序,第一個? 選擇排序,第二次? 插入排序,第三? 我聽到了一些選擇排序。 其他的想法? 所以,事實證明, 所有這些算法 基本上是一樣有效,因為 每個other--或者相反,正如 低效的,彼此 因為我們能做到從根本上 不是所有的三個好 這些算法。 而這一點善意的謊言的,太。 當我說是有效的 或者效率低下, 這至少為 超級大n值的。 當我們只有八人在這裡, 或者是50元左右吧在屏幕上, 你會發現絕對差異 其中這3種算法。 但隨著N,人數, 或號碼的數目, 或者人在電話號碼 書,或網頁的數 在谷歌的數據庫 變得越來越大, 我們會看到,所有這三個 算法實際上是非常差的。 而我們能做的根本 比這更好。 讓我們來看看,最後, 什麼這些算法可能 聽起來像在 幾人背景 並通過這種方式 可視化在這裡 這將我們介紹給 一些算法。 讓我們繼續前進,並祝賀 在這裡我們的參與者,所有的人 整理自己很好。 如果你想藉此臨別禮物。 你可以把你的號碼也是如此。 你會看到什麼, 或者更確切地說,聽,現在, 是因為我們把聲音 每個這些條 並將其與軟件相關聯, 不同頻率的聲音, 你可以用你的頭腦更audioly 各地各有什麼這些東西 看起來像。 其中第一個是插入排序 [音調] 這是冒泡排序。 [音調] 選擇排序。 [音調] 一些所謂的合併排序。 [音調] 侏儒排序。 [音調] 這就是它的CS50。 我們會看到你在星期三。 旁白:現在,“深 思考“,由Daven法納姆。 為什麼一個循環? 為什麼不讓它變得更好? 我做了五圈。 [笑]