[音樂][音樂][音樂]您好吧,這是cs50,這就是我們今天對數據結構的看法回想上週,我們給自己一些新成分和一些新在C語言中,我們引入了指針通過以下方式尋址內存塊的能力:實際地址0 1 2 3及以上,我們介紹了星號和其他幾個函數在其中自由分配了malloc,因此您實際上可以管理計算機的內存只是為了錘擊這個家,讓我們來看看只是一個小例子,從一開始就是錯誤的,這段代碼是錯誤的,我們將在片刻之後看到為什麼讓我們逐步介紹一下用黃色突出顯示的第一行是您所了解的現在,如果自上週以來您有點生鏽,那第一行是什麼用英語完成的代碼的任何事情,是的,它創建了一個指向一個整數並調用該點或變量X,然後讓我提出下一行在做同樣的事情,為我們提供了另一個指向整數的指針但是這次將其稱為Y第三行代碼是什麼這條線是英語發生的,是的哦,這不是bug,但這是第一部分,正確的Malick是我們上週引入的功能,它可以為您分配內存一個參數,即使您不希望分配的位元組數回想一下您需要多少位元組的整數才能調用此其他運算符我們上週簡要看到的大小,在這種情況下,我們將在大多數情況下返回可能取決於您所使用的計算機,所以這就是說嘿給我四個位元組的內存,它將那塊內存返回給通常是通過第一個地址,所以X發生四個位元組,然後將其存儲在X中其實還可以,因為正如您最初提到的,X實際上是一個地址,所以這一切都是在聲明一個名為X的變量,最終在其中存儲合法內存塊的地址通常不會像這樣分配int,而是分配int就像第一個星期一樣,使用int
n分號但是現在我們可以分配地址和分配內存了您可以在這裏實現相同的想法,這條線現在是代碼說英文星號x等於42分號是什麼,是的good轉到X中的地址並將其設置為42,因此star運算符是解引用運算符,這是一種前往該地址的好方法當我們討論賦值運算符時,您想要每週做好的事情是1它只是說將數字42放在那裏,所以無論malloc在哪裏找到四個位元組可用的內存對我來說,這第四行代碼說去那裏然後把數字42通過在最後一行加上適當的零和一,這裏是錯誤,如果我們最終在這裏顯示這一行是錯誤的有誰知道為什麼在這裏確切地說,我已經為該變量分配了內存,因為在這裏我剛剛說過int star Y分號,您只能假設其中有一些垃圾值一些未知的值,可能是來自其他部分的殘留物在這裏不一定是正確的程序在程序開始時,但是為了安全起見,假設您不給變量一個知道它包含什麼的值,它有一些假地址這樣一來,如果您說Y明星去那個假地址,那將是壞事發生,也許您已經在pset 4或之前的某種方式中遇到了這種情況代碼的內存問題或分段錯誤或seg錯誤不好當您訪問不存在或什至不存在的地址時,事情就會發生知道他們在哪裏,所以這一行代碼不好,但是我們可以做得更好一點,如果我做我實際上分配的這樣的事情怎麼辦到YX,這樣就說在Y中輸入與X中相同的地址,然後使用代碼的最後一行,如果我現在說星y等於13,那你是不是紅色,我現在在做什麼正確好,現在為Y分配了內存,所以您說的是轉到該地址,然後將13放到那,但是我們對42做了什麼,只是為了清楚我們被破壞了我們用13覆蓋了它,因為如果x和y是相同的地址說去那個地址,然後把42放在那裏,然後兩行,我們說不,不,不去那裏放13代替,但是長話短說,壞事發生在您不一定會預測內存中的內容,也不會分配內存您自己,多虧了我們在斯坦福大學的一位朋友,這讓我們花了一點時間如果您願意在這裏拍攝短片《粘土化》的話,以更令人難忘的方式拍攝同一張圖片,可能會使燈光昏暗[音樂]嘿,賓基醒了,該指針了有趣的是,關於指針的知識是什麼?
上手吧,我想我們需要幾個指針這段代碼分配了兩個可以指向整數的指針,好吧,我知道了這兩個指針,但它們似乎沒有指向正確的任何東西最初,指針不指向任何東西,它們指向的是叫點緩解並將其設置為一個單獨的步驟哦,對吧,我知道三通是分開的,所以如何分配尖頭好的,這段代碼分配了一個新的整數點E,這部分將X設置為指向它,嘿,看起來更好,所以讓它做點好吧,我會取消引用指針X來為此將數字42存儲到其指針中技巧,我需要我的魔術棒取消對你的魔術棒的引用取消引用那太好了,這就是代碼的樣子我只是設置電話號碼,嘿,看那裏,所以在X跟隨箭頭訪問其指針在這種情況下,要在其中存儲42,請嘗試使用它存儲數字13通過另一個指針,為什麼好,我會過去這裏到Y並獲得設置13號,然後使用取消引用的魔杖,哦,哦,嘿,那個沒有工作說小指,我不認為取消引用Y是個好主意,因為你知道設置點E是一個單獨的步驟,我認為我們永遠不會是嗎,是的,是的,我們分配了指針Y,但我們從未將其設置為指向一個非常觀察的點,嘿,你看上去很好,賓基可以嗎修復它,以便Y指向同一點E是X確保我將使用魔術棒指針分配的問題將是一個像以前這樣的問題觸摸指向緩和點,只需更改一個指針即可指向與另一個哦,我現在看到Y指向與X相同的位置,所以現在等一下Y是修復了它的問題,因此您可以再次嘗試取消引用的魔杖以發送13點好了,嘿看現在您是否引用了關於為什麼以及因為指針共享該對象的作品第二點,他們倆都看到十三個人分享哦,無論如何,我們要現在切換位置哦,看來我們沒時間了,好吧,所以現在我們有了這種指針和地址的功能,我們可以低級訪問計算機的內存,我們實際上可以更強大,更有效地解決問題更有趣的方式,但首先讓我們激發其中的一些問題,然後返回在第二週,我們引入了數組,這是我們第一個數據結構,如果您將在第一周之前就擁有了諸如此類的變量intz,chars和floats等在第二週,我們引入了數組表示您可以總共存儲2英寸或3或10或100所以不幸的是,您可以將大量數據封裝在一起數組沒有理想的強大,例如,如果我們有一個大小為三的數組,我們實際上要繼續存儲三個值在其中一二三假設我們實際上想要存儲第四個值,但我們沒想到壁虎召回畢竟,對於數組,您必須預先聲明其大小,這樣您就可以硬數字三或包含三的變量,但假設我們想存儲第四位,您可能會認為,只要給我緊挨着數字3右邊的另一個記憶盒,以便我可以保持我所有的數字加在一起,但是不幸的是上個星期確實是一個可靠的假設,因為在其他情況下計算機的內存中,此處可能被其他位元組包圍着一二三而在上週,這些位元組可能大部分都被一些其他數據填充了程序的其他部分,但是您會認為它看到了一個二三是畫在這個角落,可以說沒有第四個數字的空間,因此您不能將第四個數字添加到您的數字中數組是否有解決此問題的解決方案我們可以說是一點點加法嗎,所以也許我們可以正確地將其移至其他內存,因此我的內存中有很多Emma每個上週,但仍然有可能基於這張圖片一些未使用的內存,所以也許我們可以調整數組的大小來擴大內存,而不僅僅是移動所有內存坦率地說,如果我們不得不轉移所有這些字符,為什麼不將1 2 3移到此處,這給了我們至少4的額外空間,即使您正在使用比賽,可以通過實際移動內存來實現此目標但是考慮一下其中涉及的內容,所以如果我們將舊數組放在左上角我們在右下角有新數組,大小為4,所以我們有我們有足夠的空間來調整數組的大小,這有點幻覺當我們擁有所有這些M O時,您不能只是調整數組的大小相反,我們實際上必須移動陣列或複制它,因此1被移到新的內存2被移到新的內存3到新的內存,然後在那時我們可以扔掉或釋放以前使用的內存,現在繼續添加我們的4,不幸的是,這不是必然是最好的策略權利,因為如果這三個儲物櫃代表我們原來的記憶,這四個儲物櫃代表我們的新記憶,他們故意分開很遠,這就是說,如果我想繼續前進,像這些相同的數字一樣移動我真的必須做這樣的事情涉及很多步驟,讓我繼續,現在將1放在那裏我繼續前進,將2放到這裏,然後我可以繼續將它放到這裏,所以現在我有了2,最後我可以抓住3,即使我做了在螢幕上很快,現實是工作要做,然後我當然仍然必須繼續並將4添加到混合,就是說我在形像上和身體上已經花了很多步驟以將數組從大小3調整為大小4,也就是說,如果我們現在考慮效率,或者您是否會考慮該算法的效率插入時涉及什麼樣的操作?
正如我在這裏所做的那樣,在向數組中插入其他數字時涉及這是幾週前我們關注的選項菜單算法甚至基於那個簡單的演示您會說運行時間是嗎再次o N平方,所以也許Owens平方來回很多,我們已經看到了冒泡排序和選擇排序的總和還不如沒有和FN一樣糟糕,為什麼你說n uh huh確切地說,無論您在這裏擁有多少個儲物櫃,這三個都是但更籠統地說,它將花費我n個步驟來轉移這些數字在這里或從技術上講,如果我來回走走,它將帶我三個人像六個步驟,但它是n的倍數,所以不是N平方一次又一次地重複疊代,我只需要移動三個數字到這裏,然後加上第四個數字,所以當它確實是n的大O您想繼續插入或搜索等效的數組實際實現的抱歉插入將佔用我們線性時間,但進行搜索回想一下,這是功能強大的事情,搜索的運行時間是多少,所以只要您保持每兩週前對數進行排序,這是對數的,所以我們並不一定要犧牲這一點,這就是將我們的數據存儲在排序的數組可以使用二進制搜索,但這很昂貴而四處移動不一定是讓我們只要考慮一下代碼中的外觀,讓我在這裏轉到cs50
IDE讓我繼續創建一個名為列表點C的新文件,看看是否我們不能在代碼中確切地表達這個想法,所以讓我繼續並為我自己是標準的IO點H,以便我們最終可以打印出一些值我繼續,然後聲明main int main void,然後在這裏讓我們從三個整數開始任意地開始,這些整數分別稱為列表和大小三個,所以我只是模仿了我們從繪畫開始的地方一個固定為大小三的數組,然後如果我繼續進行初始化該列表,我只能輸入硬代碼進入程序本身,將這三個值放入括號零一和二分別編號一二三,所以我只是手動初始化數組化為三個值,然後使該程序在生活讓我繼續前進,我做的等於0我小於3我加加,然後讓我們只打印這些元素只是為了很好地衡量它們每個都是一個int所以我們將使用%I,然後我將繼續打印清單支架I這種風格較弱的程序,我要做的就是硬編碼一組大小3使用3個值1
2 3 0索引對其進行初始化,然後將其打印出來如果我繼續保存並列出我的清單,然後繼續進行編譯與點斜槓列表,我應該希望看到1 2
3但有一個問題基本上是因為我已經輸入了硬編碼顯式地,此數組的大小如何添加第四個元素我該怎麼做才能將代碼更改為4,然後我可以在這裏添加另一行,然後我可以更改它,但是我必須重新編譯它,因此它肯定不是動態的,但是我們確實看到了最後一個函數一周,可以讓您動態分配更多內存,並確定是什麼該函數,所以malloc現在,我們有了malloc,您無需鍵入從一開始就進入程序源代碼中,您實際上可以現在只在這裏動態分配一些內存演示的緣故,我們將通過某種方式來達到相同的目標這樣可以更有效地擴展上週的回憶如果您想從malloc獲取一塊內存,它將返回該內存塊的地址,因此建議我可以聲明一個指向一個叫做list的整數,然後讓我繼續分配3整數最初乘以整數的大小,所以這是一個整數有點奇怪,但考慮要求這樣做malloc一個int大小的3倍,所以給我足夠的內存以適合3個整數定義,該定義在上週返回一個指針,因此我們必須將其分配給左邊的指針,所以list是一個變量,就像我們的x和y前面的示例存儲該內存塊的地址,但是關於C的最酷的是,既然您知道列表是一塊內存,可以採取行動,我們藉用相同的方括號從第二週開始的符號,如果以下情況,此代碼實際上不需要更改您在指針名稱旁邊使用方括號表示法計算機會自動轉到第一個自動為您發生該索引中的內存塊中的位元組將轉到下一個內存,這將轉到下一個內存塊中malloc為您返回的內容以及一個位元組中有多少位元組整數四,回想一下我上週簡短提到過的表達式指針算術,與此同時,您也獲得了神奇的收穫方括號表示法不是括號零,它恰好是位元組零方括號1不是第二個位元組,實際上是4個位元組,方括號2不是第三個位元組,實際上是八個位元組,因為您分配了四加四加四12位元組,所以方括號表示法只是跳轉您將您放在那塊內存中的正確位置,以便您可以將int int是的,為什麼要在其中分配一個指向int的指針而不是一個指向int數組的指針這個上下文數組和指針在某種意義上是相同的,指針是內存的地址數組只是一塊內存,所以即使我們在第二週通過僅將它們稱為數組來使用了內存塊更一般地說,支持方括號表示法的內存塊但是現在我們可以分配盡可能多的內存,因此我們可以使用這兩個概念可以互換,並且在C中有一些細微之處,但這現在具有與第二週相同的效果,這是本週以來唯一的新行但是現在即使您不使用malloc,即使您使用的是malloc複雜的程序在這裏,您可以想像現在代碼在循環中運行,也許在需要時分配更多的內存,更多的內存和更多的內存,因為malloc允許您執行此操作,我們確實需要進行一些安全檢查在這裏,上週發現malloc有時可能會耗盡內存如果您的Mac或PC或雲端存儲空間不足,您的帳戶就可以了可能要檢查返回值,所以好的做法是等待分鐘,如果列表等於等於null,讓我繼續前進,返回一個錯誤,因為我的計算機內存不足了一些原因,因此最佳實踐會說,只要您分配內存,就始終檢查如果您現在返回了null,那麼讓我為您做點什麼演示讓我將窗口移至此處讓我突出顯示這些行代碼,然後在第5行和第13行之間做出突出顯示的聲明由幾行代碼組成,這些代碼僅分配了大小為3的列表並存儲了3價值觀就是我們剛才離開的故事,現在我改變主意,決定在第13行之後,或者在該程序的其他地方決定更大,您知道我實際上想要的是另一個我想要調整大小的整數那陣列很好,我該如何去做得好,讓我繼續做下去這讓我繼續進行分配,例如分配另一個地址並說存儲使用該地址在該地址對應4個整數的內存塊像以前一樣使用sizeof運算符,所以暫時讓我繼續,給自己一個新的足以容納整數而不是3 let的大塊內存我練習最佳做法,並說您知道以防萬一,如果溫度等於等於否,因為我內存不足,忘記了我已經用程序完成了我們還是不會繼續,但這只是現在的好習慣,但是現在如果我現在有兩塊內存,我要怎麼做,這是一個大小為3的內存這個是4號,我們上次想移動東西時做了什麼在計算機內存中,我實際上對我認為的儲物櫃做了什麼你在點頭我做了什麼是的,正是我經歷了每個步驟,然後從左向右複製了值老到新,所以讓我繼續做,我認為我可以做到這一點對於int的for循環,我得到0,我小於3,因為那是大小為3的舊數組我加上加號,然後在此疊代中我可以只是做這樣的事情就像數組一樣使用這個新的內存塊因為我聲稱我可以使用方括號符號並將其存儲在位置我在位置上原始列表中的任何內容,因此如果我現在在這裏使用此代碼將其註釋將整數從舊數組複製到新數組中Raye也是從舊到新都使用了四個循環,但現在不是我想做的所有事情我也想存儲在三個零的位置索引,它是第四個位置,另一個值是四這就是為什麼我將額外的四號放到那些儲物櫃中,所以現在這些代碼行我已經實現了複製所有從舊數組到新數組的值,所以我差不多完成了,除了什麼我們上週學到的是,每當完成大塊處理時,您都應該做我仍然需要原始的內存塊,如何給它回到電腦免費,所以很簡單,我只是免費打電話傳入我想釋放甚至是不完整的內存塊的地址儘管我要傳遞一個地址,但計算機仍會繁重記住我最初要求的位元組數,您不必擔心關於這一點,您只需說出這指的是什麼,然後就可以免費使用了。現在你知道現在我已經擺脫了那個清單,我要更新清單達到相等的溫度只是清理風暴的命名有點愚蠢列表的名稱,讓我重新使用原始指針,讓列表等於溫度如果我正確完成了所有操作,現在就在這裏,應該足以打印出整個列表,所以讓我保存一下,讓我給自己一個更大的終端窗口確實使列表再次出現很多錯誤,讓我們先來看一個在這裏隱式聲明庫函數malloc
dot dot dot what當您看到隱式聲明某些標頭時,通常是解決方案文件我要回想一下這很微妙,如果我使用cs50,我們可能上次沒有使用它庫,但是它的標準Lib點H就是malloc所在的地方,而free則是因此,標準Lib是一個包含上週功能的新頭文件,因此讓我再試一次,讓我這次列出的列表很好,它確實編譯了點斜槓列表和嗯,我似乎缺少第四個數字,但我認為這只是一個我這方面的愚蠢錯誤如果我看一下這張紙的印刷品,該怎麼辦是的,坦白說,新列表的大小是四你記得幾週前,我鼓勵你不要只是硬編碼數字魔術您程序中的數字,我們實際上應該使用常量或其他一些可變的,這就是為什麼,因為您就像我一樣,對細節的關注所以讓我重新編譯它,讓我做清單,瞧,現在是我的1
2 3 4要明確的是,這是一個愚蠢的程序,因為我全都決定在編寫此程序的一半過程中,我需要4分鐘,但不是整數3,當然,此時您應該刪除先前編寫的代碼因此,這只是出於演示的目的,如果您想像這會更大人們決定的程序可能是因為get int被調用他們需要更多的內存,這就是使用malloc的方式,但是事實證明,有一個功能可以使我們的生活更加輕鬆在這裏,讓我繼續清理一下,事實證明我不必自己分配更多的內存,自己複製所有這些內容然後也可以釋放它,我可以按如下方式合併這些行而不是使用malloc我實際上可以說重新鎖定,顧名思義重新分配一塊內存,您想重新分配什麼,為什麼我要重新分配列表,這一次我想做的是int大小的4倍暫時存儲這個,我要確保沒有任何問題如檢查null只是意味着嘿,您可能內存不足,然後如果可以的話,我要回去,但是如果一切都好,我就回去做並觀看此內容,現在我將代碼簡化了很多行按照定義重新鎖定,這是標準Lib
H中的另一個函數佔用您已經請求的現有內存塊的過程將其調整為這個新尺寸,無論它是更大還是更小,它都會處理從舊到新的數據複製給您,您只需要檢查一下一切都沒有錯,例如在此處檢查null並記住新值,所以現在這段代碼(以前只有六行代碼)比那隻是一個方便的功能,可以使用前面的問題真的很好的問題,所以讓我通過倒帶和所有如果您想和他們一起玩,可以在課程網站上找到完成的版本後來,這是以前的版本,僅使用malloc(如果您這樣做)我想您正在詢問正在發生什麼事情時,更新新的內存塊您是否有效地孤立了舊的內存塊因為如果您更改列表中存儲的內容並讓其存儲新的內存舊的內存塊在哪裏漂浮在計算機內存中,但您已經失去了所有指向它的指針,再也沒有從概念上指向它的箭頭,所以為什麼我們必須跳過這些擁有臨時變量的圈我們不會忘記分配的東西,今天晚些時候我們會看到還有另一個數據結構好問題,如果您將temp初始化為指向整數的指針,則不會創建您將其用作數組的問題簡短回答否,因為再次根據我們的定義,總是一個數組只是一塊內存,在C中您可以使用方括號符號跳轉到該內存的隨機部分使用簡單的算術記錄0 1 2等等上週,當我們引入malloc和free並現在重新分配時,您現在有了更多分配所需內存的低級方法,因此更多強大的通用機制,但歸根結底,您仍然取回大塊的內存連續內存位元組背對背,因此您當然仍然可以使用方括號表示法,因為本質上,數組是一塊內存,而male'給您很多您可以將其視為一個數組,它們在這個意義上確實等效您只是無法獲得像它們這樣的數組那麼多的用戶友好功能為您釋放了空間,因為我們直到上週才需要釋放大量的內存數組會自動為您完成,這要感謝編譯器。你在這裏有一個錯誤,如果我在這段代碼上運行valgrind,我會看到正是我洩漏了一些位元組,所以確實在這個程序我想釋放,讓我們確保是的,我現在想釋放新的內存塊大小為4,可以避免您遇到的確切問題確定好捕獲,好吧,就算現在很多代碼,現在讓我們考慮一下這方面的更高層次,以便我們可以然後激發一種替代方法,使我們能夠縫合在一起取而代之的是一些更高級的數據結構,因此,通常來說,數據結構只是一個C
C ++ Java Python中的編程構造將以不同的方式看到它們剩餘期限內允許您存儲信息的語言用C語言存儲在您計算機的內存中的方式有所不同,我們今天要做的是多虧了C的這三個功能,所以即使感覺很多語法,我們今天所做的一切都可以歸結為三個語法在結構之前曾見過這種召回是C中的關鍵字,允許您創建自己的結構,例如一對幾週前,我們創建了一個具有名稱和數字的人員結構,給我們我們自己的數據類型,該數據類型的結構包含兩個值,例如您使用的名稱和編號結構以及涉及的問題集位圖,位圖頭,等等,這些都是數據結構我們使用點符號只是為了清楚起見,您肯定會使用最近處理紅色,綠色和藍色像素時,是的,正好訪問結構的屬性,因此,如果您想獲得一個人的名字或獲得一個人的數字,您可以使用變量名稱,然後使用點運算符來獲取數據結構內部,所以我們在上週之前看到了今天我們再次看到這個星算子,這可能意味着不同事物在不同上下文中的關係,但直到最後它始終與內存相關這是取消引用運算符,它使您可以進入通過稱為指針的東西進行記憶,即使今天感覺像一點點的麻煩,再根據我的電子郵件,這就是現在開始的地方平穩地意識到這一切都歸結為首要原則,或者如果您將排序的三個像拼圖一樣的劃痕,我們現在將組裝成更多有趣的問題解決方案,讓我介紹一些問題稱為鍊錶鍊錶,如我們所見,它將允許您現在存儲值列表,使用數組可以存儲值列表,但是數組的缺點是什麼?
數組是固定的內存,如果要調整該數組的大小以向其添加更多值,該怎麼辦你必須做好,你最少要分配更多內存,您需要將所有這些值從舊複製到新,然後您可以現在開始您的業務realloc是一個功能,可以使您更簡單,但realloc所做的工作與我之間所做的完全相同複製值的儲物櫃以釋放內存等,因此需要完成,這就是為什麼插入數組將是n的Big O的原因,因為將整個陣列複製到新空間可能需要花費很多時間,感覺那種次優的右數組在這種意義上可能很慢,但是數組的吸引力,就像數組的優點一樣,因為我們不想完全拋棄它們,是的,您不僅可以輕鬆地將它們編入索引在語法上跟方括號,但是你有恆定時間軸,這稱為隨機訪問,在時間軸上不是隨機的感覺到你最終會知道誰可以跳到零括號或一兩個瞬間,我花了更多的時間,因為我有身體走路,但計算機將能夠跳到零一二三瞬間,所以數組超快,它們適合於諸如二進制搜索現在將出現一段時間,但是如果我們使用畫布是我們的計算機的記憶就像更聰明一點,我們不必只是彼此挨着彼此放東西然後希望最大的希望是還有更多的內存背靠背如果我們反而對此更加聰明並假設我們想要存儲該怎麼辦第一,恰好在地址牛一二三,它是任意的但請回想一下上週,您計算機中的每個內存位元組都是存放在某處,所以我們建議現在存放在ox123這表示大小為1的數組,並且您想向其添加第二個值數組或讓我們開始調用一般的東西,例如現實世界只是值列表,該列表的大小為1,現在也許有一個這段記憶中的許多Emilie都在擋住道路,但前提是那邊的計算機內存中有一些可用空間稍低,因此它不在這裏它不在這裏哎呀它在這里或這里或這裏不可用那裏還有其他東西,但假設計算機確實有一些可用的東西在這裏可以存儲數字2的內存,因為地址恰好是4 5 6最後您要存儲第三個值,它變成得知最近的可能位置在此處,恰好是3X
7 8 9的地址,因此根據定義這不是數組,因為1 23個不能連續使用的背靠背背對背此處使用方括號表示法,因為方括號表示法要求第2週,您的所有價值觀都像儲物櫃一樣緊挨着這張照片是一個在這裏2在這裏3在這裏更像是哦也許這是X
1 2 3也許這是X 4
5 6也許這是X 7 8
9到處都是,那是因為那是可用的您計算機的內存,但是如果我有點奢侈而開始使用該怎麼辦不只是一塊內存來存儲每個值,例如1 2 3如果我去向前,給自己兩倍的記憶,只是給自己一些靈活性,因此我現在從概念上使用這一塊內存來表示一個這個垃圾代表這個塊代表三個,但你知道我是什麼將這些塊中每個塊的後半部分用於任何想法和地址到下一個內存塊,例如,如果我的目標是保留此地址列表已排序,因此我從概念上希望有一個存儲一二三的列表我為什麼不將其用作地圖或麵包屑,如果您要指出的話下一個內存塊,為什麼我不使用這塊內存指向下一個,然後這塊內存,你知道我只需要一個特殊的重視這裏,什麼都沒說是個好主意在列表中更多的是null,這在技術上是不同的從反斜槓零開始,這是一個字符,這叫做好,這是從今天開始的十六進制零,我們看到了這個超級上週簡短地講,這是null,帶有兩個L,這是愚蠢的左手,不是與右手說話,ul是反斜槓零,即char和ul L是一個指針,但是如果它們在引擎蓋下都等於零,那麼您只需存儲一個特殊的價值,就是上週的清單,我建議誰真的很在乎內存中的內容,所以讓我們再做一次使用這位畫家的作品中繪製為箭頭的指針說出數字1
2 3現在已鏈接,鍊錶只是一個包含以下內容的數據結構以某種方式鏈接在一起的多個內存塊在引擎蓋下可以這麼說,它們只是通過指針鏈接在一起而我們所付出的代價是,而不是現在,在一個僅存儲數字1 2 3我們可以在數組中存儲的數字現在必須存儲兩次很多信息1
2 3以及三個指針,其中兩個正在使用中如果我想在此列表中添加一些內容,其他的都可以使用了說我們現在可以包含可以創建結構的結構僅通過使用指針的這一新功能,計算機的內存就會結構看起來很好,這些數字中的任何一個都有兩個字段似乎是一個整數,我們將其稱為數字,然後還有另一個字段在這裏,讓我們按照慣例調用下一個,但是我們可以將其命名為我們想要的任何東西這是另一個指向的內存幾個星期前,我們介紹了列表中的下一個元素一個人的名字和數字與今天無關,因為我們不處理名稱和數字,我們只處理整數,所以讓我建議我們將其備份,並在幾個星期內仍使用相同的語法之前,但我們沒有定義一個人,而是將這個矩形稱為節點是計算機科學節點中的藝術術語,OD e只是代表了這一點矩形這個矩形概念您正在使用的大量內存有趣的目的,如果對數學很熟悉的話,它有點像圖中的一個節點,但是我希望該節點存儲什麼,讓我繼續並存儲幾個它裏面的東西是一個數字,那將是一個整數,我要去前面先叫它數字,然後再猜第二個字段是什麼應該被聲明為我們想要的,我想接下來將其命名,因為傳統上,它的數據類型應該是您交出指針的任何想法,一個指向你會說什麼的指針,指向下一個數字而不是完全下一個數字本身,因為現在我們沒有數字,只有節點所以那三個黃色方框1 2
3現在是節點讓我們繼續前進,將此節點稱為星號,但從技術上講您做不到事實證明,Siri呼叫確實使您超級了,並註意是否從上到下從左到右閱讀此代碼在故事的哪一點,節點一詞的出現不是像直到最後一行是我們提到的人,這是我們在哪裏提到的節點,很遺憾,您不能在節點內部使用節點因為它在計算機中根本不存在,直到兩行稍後所以這裏有替代方案還有一個解決方案冗長而不是只說type def struct而是說type def
struct節點只需添加您要使用的單詞,然後在這裏您可以說struct接下來是節點星,這是一種替代方法,這是C的工作方式,但是這是完全相同的想法,這意味着數據結構中的任何節點和一個黃色的矩形框有一個數字和一個指針,該指針由定義是指向節點結構的指針,我們只需要表達它李在這裏更詳細,因為速記符號直到底部,節點才存在,這只是一個令人討厭的現實語法可以解決有關擊中定義的任何問題,是的,兩次放置節點,您不必兩次放置節點,您實際上可以使用任何單詞在這裏,您可以將其稱為X或Y或Z,但隨後您必須按照約定,這個B結構XOR結構Y或Z結構我將重用相同的術語,所以這是該結構的正式名稱,它是struct節點是結點更簡潔的結構的暱稱,這就是def類型它是否為您提供了從結構節點到僅節點的別名,僅僅是因為更容易在程序中的其他地方鍵入其他問題好的,那麼我們現在可以使用這種結構做什麼呢,讓我們繼續前進,在這裏建立一些東西,所以這與代碼獲取一樣可怕今天我們將主要關注圖片和概念,但讓我們來瀏覽鏈接表的相同想法的一個實現首先要很好地表示一個鍊錶,最初是空的,如果您想表示空的東西,我們最少需要因此,讓我將其繪製為這個空框,這只是指向我聲稱的一個節點,那麼我該如何實現不包含鍊錶的概念?裏面的數字還好,為什麼我們不使用這個呢?可以實現以下節點星形,我將其稱為列表,但是如果沒有可用的數字,則將其設置為null。沒有兩個就沒有三個我至少應該有一個使用變量表示沒有列表,最簡單的方法是沒有列表值存儲區0的名稱,該存儲區在上週末擁有這個新暱稱,這稱為否,因此此變量代表此處的圖片,請注意沒有數字,因為列表為空,但是我們將其初始化為null,以便我們不要以為有箭頭指向內存,因為現在還沒有,我想繼續插入將數字插入此列表,假設我想插入數字2現在為2分配空間我必須為2和那個指針分配空間否則根據上一張幻燈片一起稱為aa節點,那麼我該怎麼做在代碼中做得很好,我可以藉用與我們相同的技術現在使用了幾次,即使比過去的方法更醜陋那麼一個整數,你想要多少位元組,我不知道我的音符有多大可能會做數學運算,將整數和指針相加,但是您知道多少音符會幫我回答這個問題,所以這個返回一塊足以存儲便箋的內存,我要將其臨時存儲在名為in和for的變量中那將只是一個臨時變量,如果您再次這樣做的話儘管這裏發生了一些新情況,就像以前一樣我現在想分配一個整數,我想要的不僅僅是整數。
實際節點和malloc返回一個地址,這意味着我必須將其分配給一個變量,它是左側的地址,好吧,我應該總是做些小破壞,因為實際上我點擊了一下,如果不是要在這裏前進,這是最醜陋的事情,我們將看到什麼第二行代碼在這裏做什麼這裏發生的事情你認為是的您認為是將該節點的數量設置為-但是為什麼如此瘋狂我們之前從未使用過的語法將在上週看到只是意味着去括號是操作順序所必需的這樣編譯器就知道可以先去那裏,然後一旦您在那裏就可以做什麼您想要訪問數字字段,因此您使用相同的點符號所以這很醜陋,但它只是在做我們已經看到的兩個不同的事情隔離到該地址和那是那塊內存的n,然後訪問數字字段並將其設置為等於2幸運的是C具有一些語法糖只是更簡單,更漂亮的方法,它看起來非常漂亮就像實際的東西一樣,我們一直在畫這個箭頭符號,所以如果您看到而且您曾經用C編寫過這種記法,我很確定這是最後一個新方法語法,我們將在非常熟悉的包時代中看到此箭頭命中一個-然後大於一個a表示這個與此完全相同這只是令人討厭的打字,看這是醜陋的坦率地說很漂亮,讓人想起我們一直在畫的照片左右箭頭指示我接下來要做的下一步為這個第二個節點分配新的節點該節點哦,抱歉,請輸入下一個節點的地址,但是沒有下一個節點但是,那你能不能用這個佔位符呢,確實我要要做這個箭頭符號,你也不需要做星星,然後點和括號每個人都只是在真實的地方寫這樣的代碼世界,所以n箭頭接下來為空,這現在給我吶喊,現在給了我我們正在繪製的圖片,但再次檢查是否使用malloc,應該總是檢查返回值,所以要非常精確,讓我繼續並添加再檢查幾行代碼,僅檢查n是否不為null即可相反,以下所有內容我都可以檢查an是否為null,然後退出或根據我在哪裏使用此代碼返回,但您不想觸摸並使用此箭頭符號,除非您確定n不為null,那麼我有什麼剛完成,我的圖片現在看起來像這樣,但這當然不是鏈接列表因為沒有任何聯繫,我真的需要做從這個指針指向這個結構的箭頭,我需要實現一個看起來像這樣的箭頭,那麼我們如何才能在代碼中很好地實現它讓我建議,這就是最終的樣子,我們只需要畫那個箭頭我怎麼做得好,就這麼簡單如果list是一個變量,並且之前僅將其初始化為null佔位符,n是存儲足夠的新節點的臨時變量說井列表不應該再為null,它實際上應該等於我剛剛分配的那部分內存的地址,這就是我們得到的方式現在在計算機內部的這張圖片現在讓我做更多的事情操作假設我要向列表中添加數字4如何添加4號好4號在它自己的節點內,所以我必須回到像這樣的代碼,我需要分配另一個安裝該節點的節點4在那裏,但這不是您只想要創建節點的全部,因為否則,它就在無人區中,所以現在我們需要添加箭頭,但是現在如何更新箭頭有些不明顯對,因為我不想更新列表以將其指向4,因為那樣可以說是個孤兒,可以說第二個從概念上講,我真的想將doubles指針更新為4,所以我該怎麼做好吧,您知道我能做的是,如果我願意,我可以遵循這些麵包屑聲明一個臨時指針,最後使用一點多餘的指針如果我是一個名為temp TMP的變量,則可以使用這種小指針表示法繼續並指向列表所指的同一件事,我要檢查下一個值是否為null如果它是我發現列表的末尾,那麼真的可以跟隨那個箭頭,現在我知道我在一個空指針上,所以現在我只想在這裏畫這個數字,我不小心推進了我想要的螢幕在這裏實際畫出這個箭頭,那麼我們該如何做我們如何去做得好,那裏的代碼可能看起來像這樣,所以如果我想要像我用大模糊手一樣指向一個節點將指針初始化為等於列表本身指向的指針那麼我可以像while循環那樣做,看起來有點奇怪,因為我正在使用我的一些新語法,但這只是在下一個字段問問題我指的是不為null繼續並遵循它,所以再次這樣今天的語法會變得很複雜,但這只是在說我指向不為null的下一個字段的特定點繼續並更新自己以指向它所指向的內容,所以如果我前進到這是下一張幻燈片,就像我最初將其指向時,我看到一個箭頭我要跟隨那個箭頭我要跟隨那個箭頭清單是我只是繼續移動我的臨時指針來跟隨這些麵包屑直到我打零,所以在這個故事中讓我建議我們添加另一個第五個和第五個當然,如果我們將其排序的話,那一定要去這裏再一次,它們都在我的計算機內存中,它們並不完美直線,因為誰知道那裏有可用空間,但現在我發現了這一點,我想繼續使用非常相似的代碼創建一個指針到我們剛剛看到的,但現在讓我們在這裏再做一個開始,然後在中間再看一遍,看會出什麼問題如果我們真的想按排序順序存儲此列表,那將令人擔憂我可能現在想起來的目標是將一個插入到此鏈接列表中有什麼想法嗎我想先做好什麼,你知道什麼讓我繼續前進,並指出正確你知道如果我想在列表的開頭顯然要去什麼保持排序,使箭頭最終從左向右移動,讓我繼續使用這樣的代碼分配新節點,然後讓我繼續前進,只是像這樣移動箭頭,這是錯誤的,即使我們沒有看到了它的代碼,但是為什麼會這樣呢?我是五個孤兒,所以我變成五分之二變量和我擁有的變量就是您在板上看到的變量,因此如果沒有任何東西指向兩個了再無所謂兩個都指向了四個和四個指向五個,我們有孤兒-傳遞性地四個和五個,所以如果您使用valgrind回憶起來,它們只是丟失了,這是內存洩漏並被valgrind大喊大叫,因為您正在洩漏內存,這可能是因為是的,您忘記了釋放內存,或者更糟的是,您可能已經擁有完全忘記了您正在使用的內存,並且根據定義您自己的代碼,您再也無法詢問該計算機了為此,但您永遠無法將其歸還,因為您沒有任何變量記住它在哪裏,所以我們不想這樣做,而我們想這樣做大概讓我們先指出一二二列表的開頭有些矛盾,但一旦指向兩個您的下一個更新列表有什麼意義呢?您可以在代碼中完成此操作如果您只需要兩個步驟,就可以更新您的下一個字段新節點,它代表我剛剛分配的節點,您可以初始化它以指出列表指向的對象,因此,如果您想要此東西指向同一件事,這個事物實際上就是在指向你在代碼和箭頭下一個等式中說,您說列表應該相等且本身再一次,您將在本週的部分以及即將到來的問題集中看到應用這類代碼行的實際機會,但這是您現在應該注意的各種思維過程3是唯一的一個特別令人討厭的東西,如果我們不看這個代碼實際想將某些東西放在列表的中間,讓我們只是從概念上考慮發生了什麼,我們已經為然後,該節點需要更新我們可能不想指向的節點出於與您確定的原因完全相同的三個原因,我們然後孤立了四個和五個所以我們首先應該從概念上更新三到四個它看起來像這樣,現在我們可以更新兩個到三個,我要揮舞我的代碼只是因為現在有多個步驟可能必須具有某種疊代現有列表的循環使用小於或大於嘗試找到合適的位置在正確的位置,然後您必須操縱指針來執行此操作不需要為即將到來的事情做一些複雜的事情習題五,但它只是陷入一些不平等的循環中檢查指針,然後進行一些指針更新,但通常更容易在末尾添加內容,甚至更容易在開始時添加內容如果您不在乎維護任何排序的訂單,是的一個指針和緊密的指針,讓我滾動回到這裏的代碼,好的,這是Malik會給我們提供足夠大的內存來存儲節點的聲音節點星號n為我們提供了一個指針,該指針是節點的地址,因此我們將把malloc的返回值簽名到該變量,以便n有效地表示一塊足以存儲節點的內存,n是一個note是指向節點的指針n是節點星號或指向節點的指針以及這是否意味着並且是節點的地址,應該有意義,因為malloc返回一個地址,但這就是為什麼我們現在使用箭頭符號和不是節點,您不能做n點號,接下來您必須做星號東西,然後再點或者更簡潔地說,現在您做了一個箭頭空氣和箭頭接下來的一個好問題讓我們看看是否可以將其設為也許有一個演示更真實一些,讓我繼續前進,在螢幕上,我們要到達的終點是為了使一切順利,我想我們可能需要五個志願者也許讓我走得更遠,然後回到那邊好一回現在那裏的手是假的,好的,如果我們可以在這里三等三回到那邊,好吧,是你的朋友和五個人自願參加的被你的朋友們自願志願你要參加來吧Brian會幫助我進行這個演示,如果你們五個人可以過來,過來,在這裏,我們有一些空間可以我給你一些咪高峰和介紹,好的,謝謝,但是你們兩個,兩個坐在旁邊的人英勇地誌願給他們,所以你們和你們倆都遇到問題關於你自己的事你好,我叫Giovanna
Giovanna,一年級或二年級還可以見到你好,我是愛瑪我是大四生,也很高興有你,是的,我是雅典娜的二年級學生嗨,我是安娜,我在馬修斯大一,我是伊桑,我是大一很抱歉第一年的逗號,他們很棒,謝謝大家志願服務,讓我們繼續前進,做到這一點內存,如果可以的話,如果您可以全部備份到這裏,只是為了我們有一些可用空間的地方,我們需要你們中的一個來代表點燃Siobhan名單中的Shobana出現了嗎Shobana您想繼續代表清單並代表我們我們有實際的清單,或者Brian是的,我們有一個名簽,你好,我的名字是list,所以您將要代表左側代錶鍊接列表的矩形本身,現在我們首先要開始哦,將您初始化為null您可以直接將其放在背後,這樣您就不會指向除了代表列表,什麼都沒有,列表中沒有數字在列表中,如果眼前的目標是插入2 4 5 1
3,下一步是什麼我們要先做些什麼低級操作才能到達那裏是代碼malloc的第一行,所以我們要為2分配一個節點,讓我們開始吧繼續,malloc好吧,所以malloc和你叫什麼名字伊桑好的,我們需要給Ethan做些什麼Ethan有兩個值或兩個字段,第一個是第二個,謝謝第二個是一個稱為next的指針現在您不指向其他任何人,所以將其放在背後現在我們要怎麼做Shyvana我們必須做什麼指向他是的兩個好吧,現在這代表了我們在此處列出的圖片但是null指針也很好接下來我們想在列表中添加4在繼續進行malloc之前,我們要繼續做得很好嗎?馬利克(Malik)好的,現在布萊恩(Brian)為您提供一個可愛的數字4和一個指針我們要如何處理您的指針,現在指向任何東西,現在有點我需要做更多的工作,我需要一個臨時變量,所以我將扮演這個角色沙巴娜(Shabana)指的是這樣自然就可以了,我們無法得到指向對方的手身體上的方式,所以我們在這裏要指出的是同一件事在-我在尋找什麼,以便確定在哪裏放置大於某個值,所以我要檢查它是否大於四個所以我繼續走下去,你叫埃里克·埃森(Eric Ethan),對不起,埃森(Ethan)你指着什麼都沒有,所以這是一個機會,他沒有權利所以讓我繼續,讓伊森不自然地指向雅典娜,但這就是很好,雅典娜新聞現在也更新了她的指針,不是,她很好,她表示列表的末尾,因此她的指針可以留在後面正確,讓我們繼續,並為您分配五個要代表的代表,所以現在我們需要五個所以我們需要給你5號,你又叫什麼名字薩里卡(Sarika)好吧,所以薩里卡(Sarika)保持着她的第五名得到一個名為next的指針Sarika應該指向什麼,而現在我如何將她正確地插入正確的位置,我必須做同樣的事情,所以我會再次參與其中,成為一個臨時變量,我要指出Chavannes指著同樣的東西是Ethan,我要遵循這個看看哦,等等,他實際上是在指著別人哦,我要跟隨它仍然是第四,所以我想繼續前進,請稍等雅典娜沒有指向任何人,這是現在有機會獲得雅典娜點在五點鐘和哇,但你會改變你的指針但是現在還沒有所有事情變得有趣起來,我們可以繼續前進了嗎?malloc一,你叫什麼名字艾瑪好吧艾瑪,我們名列第一對於Brian來說,您有一個指針也應該初始化null,現在我們要執行幾個步驟,我們要做什麼前45你是什麼,你的建議是臨時指針,所以我要Siobhan指出的同一件事是這裏的Ethan,但我看到兩個大於一個,所以我實際上想做什麼我們會讓我不正確的一會兒,席瓦(Shyvana),您能指出第一嗎?
只是做錯了我們孤立了其他所有人,而且更明顯的是現在沒有人指著伊桑(Ethan)或更高,這意味着我們只是將內存洩漏到已恢復或免費,所以我們不想這樣做撤銷ctrl Z我們要做什麼取而代之的是你叫什麼名字艾瑪,你想同時指出什麼Siobhan指的是等效的東西--Ethan所以繼續用你的像撚線機那樣做,現在就可以了,然後Shobana您想指出什麼是完美的,所以又要涉及很多步驟,但是它實際上只是兩三個步驟,具體取決於我們要使用的指針更新,最後讓我們繼續Matlock 3,你的名字又是anuraag,所以讓我給你一個3來自Brian,我們為您提供了一個指針,該指針最初初始化為null,因此你可以把它放在背後,我要指出的是Shobana,我們走一小兩個小四個更大,所以讓我們正確地說,我們想指出誰是誰前三個應該指向四個,所以繼續前進,可以稍稍踩一下向前,這樣看起來就不太尷尬了最後是大結局Ethan,您想指出第三嗎?值得慶幸的是,所有這些步驟之後,我們有了一個鍊錶,我們有很棒的你們每個人的紀念品,我們只需要返回數字,謝謝您給我們如果我們可以的話,請志願者在這裏,您可以將數字放在這些桌子上的人離開了舞台,現在我要指出一個這種方法的缺點非常感謝大家即使你們都有看到一,二和三的奢華和四個和五個,您可以立即找出問題所在甚至這些鏈接列表都是用內存塊實現的,就像陣列或等效的儲物櫃,計算機只能查看一次存儲一次,也就是說對於一台相同鍊錶的計算機看起來像是對鏈接列表中的特定數字視而不見直到它打開了內存的每個門,所以定義了3到哪裏找到5的位置或找到其中所有這些門的最大位置需要一次打開一個以找到該值,所以有了鏈接列表,我們有了獲得了一項功能,我們獲得了將其動態添加到列表的能力對,我只是讓Malik
Malik Malik留在了其他學生和其他地方數字,以便列表可以按我們想要的大小增長,在這種情況下,五次,我們可以做50次或500次,以添加越來越多的數字有一個好處,因為我們不必浪費時間通過調整大小來插入數組並移動所有原始內容,我們的志願者都不需要從技術上講,只是插入數字5或3指向記憶中的其他人或舞台上的其他人,所以如果您的數據現在作為鏈接列表的結構如下所示我們為此付出了代價,為此付出了代價。調整清單大小,而不移動周圍已經存在的所有內容您可能會看到鏈接列表的不利之處是什麼?在這裏丟失或放棄了哦,抱歉,我們再次失去了隨機訪問權限那是我們失去隨機訪問的原因,原因是從列表開頭到結尾的方式是通過遵循以下步驟這些箭頭後面的指針這些麵包屑,您不能只跳到中間元素,儘管顯然這是我們所有人都在螢幕上看到的人類是中間因素,如果您是計算機,您將不知道如果存儲此數據結構的主變量是類似席瓦娜(Shyvana)指向您必須遵循的列表的前幾個元素所有這些箭頭都坦率地數了起來,然後追溯李意識到哦,有五個我早先通過了中間的一個隨機訪問以及過去我們做了什麼出色的算法具有隨機訪問二進制搜索功能,因此我們已經失去了執行二進制操作的能力像以前一樣有效地進行搜索,因此如果現在考慮不幸的是,鏈接列表的運行時間我們已經支付了該價格現在搜索已經回到線性,我們不再運行對數時間,因為我們將這個數據結構縫合在一起而找到列表結尾的唯一方法是遵循列表中間所有這些箭頭,您不能同時插入到其中一個位置在最壞的情況下,n的大O的列表也將是線性的,因為必須遍歷整個列表才能真正找到給定的位置數字,特別是如果您嘗試使其保持排序,那麼看起來即使我們已經獲得了更多動態插入的功能,並且我們可以在記憶中建立一些更有趣的東西,你可以想像這總體上減少了時間,因為您不必繼續移動所有東西就像我們重新分配一樣,不幸的是我們付出了一些的價格,但是很多,讓我們繼續進行五分鐘的休息水果在外面等著,我們會回來的所以在休息時,我整理了清單程序的最後一個例子使用所有這些構建基塊,讓我們看看是否不能遵循圖示和代碼方面的智慧,我們只是用所有這些構建的東西在舞台上的這些人中,所以這裏是列表三,請參見在線如果您願意的話,以後可以在家中跟着走通過預先為我們寫的那一行我正在使用標準I
/ O對於printf,我正在使用標準庫進行malloc並釋放我們的新朋友,給我們動態內存這裏是一個節點的定義,該節點再次具有其中的數字和一個指針,特別是指向另一個節點的指針結構,所以這就是我們每個人這次在C中所代表的為了演示目標,我的主要程序是做什麼的手頭只是編寫一個程序最初將鍊錶初始化為Nothing,然後添加一個節點,然後添加一個包含兩個的節點,然後添加包含三個的節點,我們將使其簡單而不是這次加四或五,所以我要如何在第17行做得好建議我們創建一個名為list的變量,並將其作為a的地址節點,因此,如果我現在以圖形方式繪製此圖形,它將就像我們的之前的演示中,我在這裏有一個稱為list的矩形,最初它沒有指向任何東西,所以我要將該框留為空白代表null,所以這是第17行,現在讓我繼續執行下面在列表中添加一個數字,如下所示:第20行給了我足夠的信息節點的內存,它將內存地址存儲在名為n的變量中第21到24行只是安全檢查,如果有任何錯誤,返回一個並停止程序由於某種原因我們內存不足,但是這些兩行現在應該看起來有點熟悉,這將繼續並按如下所示將一個和null安裝到該結構中,讓我們回顧一下第20行與實際上分配一個看起來像在內存中有兩個一半的這些字段之一稱為數字好的,接下來是另一個字段,然後如果我們回到這兩行代碼只是關於在該結構中安裝值所以如果我繼續下去,那就是一個數字,再把它放在第一位,我不會打擾畫下一個東西,因為我要隱式地將其保留為null這就是現在正在發生的事情接下來我要做好的最後一件事此註釋下的代碼行,其中說要在列表中添加數字等於n,其中n再次指向這個新節點,所以這是同一件事就像說井清單將繼續指向該新節點一樣這些行代碼我在內存中創建了一張圖片,看起來很有效像這樣現在讓我們繼續,將第二個添加到列表中,這幾乎是同樣,這是將要添加的第二個節點的代碼塊列出這次包含兩個的內容,讓我們一步一步地做第30行,我要重用n作為我的臨時變量,因此我不必閱讀小餅,它是相同的,和以前一樣,但是現在有了不同的內存地址malloc,這樣就給了我另一個類似的盒子,然後我繼續畫畫像這樣,什麼都沒有,最初我要確保/第31行到34,沒錯,但這和之前和現在的第35行一樣36我要在其中放兩個,然後為null,所以讓我過去來吧,把兩個放在那裏,我會毫不留意地隱瞞那是列表的末尾,但現在我當然在概念上必須鏈接節點4-1到節點4-這是C的語法,即使它是新的終於有道理了,我在說下週的清單箭頭可以完美地映射到圖片列表的下一個等式箭頭,因此代碼實際上終於排好隊,儘管今天是新的,所以現在我畫了畫如下所示的1和2讓我們繼續添加第三個也是最後一個節點在這裏使用這些行包含數字3,所以40行給了我一個新的帶有malloc的節點,所以要給我一個新的節點,將其繪製為矩形在這裏我從左到右畫,但是這些東西可能到處都是在內存中,無論它們最終在哪裏都無所謂,我將繼續檢查在此之前,它不是null只是為了安全起見,然後我繼續安裝數字3和那裏的null就像以前一樣,這意味着我們繼續第3張,我將留空,因為它將為null,然後最後一行通常不會對此進行硬編碼或明確地編寫在程序中,這比您讓我建議您要冗長的多可能會使用某種循環來遍歷數據像我之前建議的那樣逐步構建結構,但是如果我們真的想這樣做只是為了演示起見,請注意從列表開始,跟隨箭頭,然後轉到接下來跟隨另一個箭頭,然後轉到下一步,我們可以使用圖片,所以在這裏,讓我們開始列出它,然後跟隨箭頭,然後轉到下一個跟隨箭頭轉到下一步,現在它為null,所以我要更新的是與第47行完全相同,表示跟隨兩個箭頭再看兩個字段可互換,然後將其設置為等於n好,那麼剩下的在這裏,這個程序的整個生活目的只是為了打印清單,一種實際上可以使用for循環遍歷鏈接列表的方式,有點時髦,因為我們沒有I和intz,而且我還有加號等等但是for循環不需要使用整數或眼睛,請記住在此之前您在分號之間進行初始化的第一個分號您有一個條件,然後在這裏發生更新,因此您最終會在問題5中獲得更多經驗,但對於今天的目的高級通知,這給了我一個臨時指針,例如我之前的那隻紅手是節點星形指針,這就是為什麼我能夠用大模糊手指向,我將其設置為等於list所以無論清單指向什麼,我都會暫時模糊手遵循以下循環,只要temp不等於戴着那隻模糊的大手,我不斷指著指點,我停了下來一旦它等於null,這就是說繼續做下面的事情,直到等於null我想做什麼我只想打印出其中的整數我要指向其數字字段內部的任何內容,請轉到我所指向的任何位置指向跟隨箭頭,然後轉到數字字段一旦我將其打印出來用於循環,裏面的數據就表明您只是更新了一個變量,那麼變量溫度等於下一步的溫度箭頭是什麼,所以如果我的模糊手指向某人,我需要更新它以指向下一步溫度箭頭這意味着轉到我要指向的所有內容,然後按照箭頭進行操作字段並指向下一個要更新的字段所指向的對象您只要不斷更新指向的內容即可打印出列表,然後,我們最終將這個問題推遲到第五步,我們需要釋放這種記憶,實際上,您必須對如何釋放自己有所了解內存,但我將在其中使用I循環,結果是小清潔工一點點容易最終釋放所有這些混亂我在計算機內存中完成的工作,我有點需要進行釋放東西,但我需要釋放我身後的東西,而不是釋放我面前的東西您釋放了內存,就不應該觸摸它,而是遍歷它,等等,但是更多在pset 5的最後註解中,可以在較高水平上回答任何問題代碼,如果它看起來很新,那很好,我們將其提供給您,您自己使用這種代碼的起點好吧,所以有人在休息時出現了注意到實際上這似乎是回歸,因為數組使我們能夠調整大小,即使它有點貴,因為有副本從一個地方到另一個地方的一切,但我們可以隨意進入,因此二進制搜索,因此可以對數運行時間來搜索諸如排序列表,我們似乎已經放棄了,向上鍊接的列表使我們充滿活力我們可以通過移動事物來擴大和縮小事物而不會浪費時間,但是我們已經失去了隨機訪問權限,但是您知道現在我們擁有使用此功能的能力指針和數據結構將內存中的各種事物連接在一起帶有箭頭的東西,您知道我們可以建立更奇特的東西的情況可能熟悉這種等級的家譜的想法二維結構,這的確是我們的靈感,如果我們不要只是繼續製作一維的數據結構數組右鍊錶,從左到右,如果我們實際使用像有趣的垂直佈局概念,我們可以獲得什麼從這個井,讓我建議,每當我們看到一個數組時,我們都可以實際重新實現的數組,但獲得了兩全其美的最好的數組最好的鏈接列表如下,這是從第一周甚至是第二週開始的數組第零週,當我們在門後搜尋時,是的,第二週,當我們正在門後搜尋,讓我們繼續前進,請注意,如果我們要這樣做像以前一樣,在二進制搜索中尋找一些值首先居中,然後決定左移或右移,如果左移或正確的是,您將在此處查看中間元素,或者在上方查看中間元素在這裏,然後您會怎麼看?在這里或在這里或在這里或在這裏,你知道是什麼讓我友善爆炸這張圖片,因為所有這些都是在一維發生的真的認為這確實發生在兩個維度上畫我相同的數組一二三四五六七,但我代表它在不同的水平上指示發生了什麼我從中間開始我向左走或向右走,然後繼續看這個元素,然後我向左走或向右走,所以是同一回事,但這是二維的每當我們完成二進制操作時,我們都會重複數週的工作搜索很好,您知道這種外觀是什麼樣的鍊錶,儘管沒有箭頭,但您知道我不想要的內容從一-二-三-四-五-六-七因為那將只是一個鍊錶,但是如果我使用newfound怎麼辦對指針的熟悉會使用更多指針,因此會花費更多空間和針腳這個數據結構在二維上概念上每個節點在這裏表示為矩形並不一定只有一個指針沒有什麼可以阻止我創建新結構,對具有我們之前有兩個指針,也許叫做左,也許叫做右我們只有一個叫它,但沒有什麼阻止我們創建一個實際上有兩個的理想結構,所以我們可以做到看起來不像以前那樣鏈接列表,但讓我們擺脫掉下一個指針讓我們騰出更多空間,讓我們實際給自己兩個左右指針,我聲稱現在在C中的此結構可用於更恰當地實現我剛剛描述的家庭樹通過以下方式稱為二進制搜索樹,這是二進制搜索樹1,因為樹中的每個節點最多具有2個子節點,因此BI中的二進制最大含義-它有零個子代最大有兩個孩子,這是二進制搜索樹中的BI,這是搜索樹從某種意義上說,我已經認真對待了這些數據,以便正確地進行分類對於樹中任何節點的以下定義,左側的每個元素都是小於它,並且右邊的每個元素都小於它這是一個遞歸的定義,因為觀察該節點的所有內容左邊的東西要小一些大一點,讓我們看一下左邊的六個小東西右邊的是較大的,因此它在某種意義上是遞歸的不管你看哪個矩形,無論我看着我說的是什麼左邊的孩子或子樹和右邊的孩子正確地為true或子樹,這就是說您是否有一個數字列表(例如)或一個列表任何東西,您實際上都使用看起來像這樣的節點來存儲它們,從概念上講,您真正要做的是將它們縫合在一起像這樣猜測,我們剛剛獲得了什麼功能我們剛剛改善了什麼我聽說這裏有些抱怨二進制搜索,因此我們仍然具有像鍊錶一樣的動態性,我們仍然使用指針並假設我們要添加數字0或數字8可以想像零在這裏經過,八在這裏經過,所以我們仍然可以插入它們而不必像我們進行移動數組,但是因為您正在用其他箭頭將事物縫合在一起只要您跟蹤此數據結構,無論它們在內存中的任何位置叫做樹,有一個指向所謂的根的指針,根倒置在這個計算機科學世界中,這就是二進制的根源搜索樹猜對了,如果您正在尋找數字7,那麼您會怎麼做看到你知道它大於四,那麼你向右移動什麼從而忽略了這棵樹的另一半,就像零週電話簿一旦到達六週就考慮我在尋找七我知道它必須在右邊,所以你走到了對於那些熟悉的以n為底的對數二的人來說,這棵樹恰好是對數的也就是說我在這棵樹中有八個或七個元素,但只有需要我一兩三個步驟來找到不取N或B的大O的值線性的步數,如果您真的想將自己的想法吹牛事實證明,這實際上是遞歸的最佳應用,這可能以前我們在建造Mario金字塔時感到有點被迫您進行階乘或階乘或乘積或總和之類的遞歸像本節中那樣遞歸地證明,現在我們有了數據在概念上存在於遞歸的二維空間中的結構遞歸定義的意思是任何給定的節點左側是較小的右側是較大的,您可以使該語句關於樹中的任何節點,請注意我們在實現二進製文件方面可以做什麼搜索,如果我在這裏有一個稱為搜索的功能,其目的是為了如果數字50在樹中,則返回true或false。
如何搜索樹好吧,它將樹作為輸入,更具體地說,它將樹的地址更具體地說,它採用樹根的地址,即當您想搜索一棵樹時,您只需把它的地址交給第一個頂端節點稱為根,從那裏您可以得到就像列表一樣,我們只需要列表的開頭所以我要如何很好地搜索一棵樹,讓我們首先考慮簡單的情況假設您的地址為空,那麼您應該怎麼辦尋找50,但您將空地址歸零假權利,如果我遞給你,你知道樹,我說是50,這是一個簡單的答案不,沒有50,因為沒有樹,所以這是我們的基本情況從我們對遞歸的討論中得來的術語,就是您鍵入的硬代碼手動操作一個明確的情況,如果這樣的話,會讓您退出程序50小於樹,並跟隨箭頭到數字字段,然後做什麼您知道50小於要查看的方向的節點從概念上講,您想轉到左側所以這行在這裏搜索可以說是留給孩子的樹木和家人樹感覺到左子樹,所以如果我們剛才回到圖片在那個故事中尋找50,或者如果我正在尋找一個,讓我們更真實一些在當前故事中,我看到一個小於當前節點,所以我繼續只是搜索左邊的子樹,注意這是一棵樹,但是如果你孤立地看它,這就是遞歸機會再來一次,如果這裏少於樹數50則繼續如果左邊的樹數大於50,則向左搜索,否則在邏輯上是正確的,如果樹存在而樹不存在該怎麼辦小於且不大於您要查看的數字必須等於您要尋找的數字50,在這種情況下,我們可以返回true但您也許還記得,從頭開始我們並不需要真正的案例可以用其他方式代替它,然後再就此代碼使用提出任何疑問實際上不會運行此代碼,但這是您可以遞歸實現的方式該算法讓人聯想到第0週在電話中搜索Mike Smith現在這本書現在搜索本身是遞歸的數據結構好吧,那麼從搜索時間方面我們可以從運行時間中獲得什麼呢?二進制搜索樹可以清楚地知道我們運行時間的上限是多少返回日誌n,這是目標以及如何將其插入二進製文件搜索樹這是我們要推遲到更高級別CS的樹,因為它原來你不想只是繼續往那邊放零和八在那邊,因為如果你繼續這樣做,把數字越來越小或越來越多的數字,您可以想像您的樹變得越來越瘦就像在這兒很高,或者在這兒很高,因此幾乎就像我們畫的樹一樣平衡,所以事實證明,有一些算法可以讓您保持平衡的二叉搜索樹,即使您向它會改變您周圍的事物,不會將它們移到內存中更新指針,以使數據結構本身不會非常糟糕高,但是定律也再次如此,這意味着我們有給我們二進制的數組然後,我們介紹了對數時間的搜索功能給了我們活力,使我們有成長的能力,如果我們想收縮,我們會犧牲二進制搜索,但是如果我們花費更多的空間並且不使用一個指針除了兩個節點之外,每個節點實際上都可以使秤小費更多的空間,通過這次使用某種東西搜索數據結構來節省時間對數沒關係,那麼每次我們談論時理想的情況是什麼感覺我們想在此列表中排在低位而不是右移N平方很慢大的O是恆定的時間如果我們真的找到了通往世界的道路,那整個故事會不會很好如果我們可以插入的話,數據結構就可以像我的上帝一樣給我們帶來恆定的時間一步將某物放入數據結構中並在數據中查找某物一步之類的結構可以說是聖杯,因為不必擔心N的大O或log n的大O達到您想要的價值,理論上發現有些東西允許實現所謂的哈希表,但是如何實現這一點不一定很明顯,需要一些時間專長,實際上是在解決問題中要實現的五個目標正是散列表的這一概念,使您可以快速檢查文檔如果每次您想檢查一個字處理程序,它將非常慢搜索時拼寫正確還是不正確的單詞線性甚至對數地是一個大字典文件,它實際上可能是拼寫檢查文件真的很慢,但是使用哈希表,我們可能可以做到更好的是,哈希表是數組和鍊錶的組合在裏面,所以我要繼續,只是為了方便起見垂直而不是水平地計時,但這是同一件事,這只是無論如何,藝術家都應該表現出來,並認為當前的目標是保持追蹤像名稱標籤一樣有效,所以也許我們正在舉辦一個大型活動預先有一些我們確實擁有的名稱標籤,我們希望人們成為能夠非常高效地拾取這些名稱標籤,這真的很煩如果我們只是大量堆疊名稱標籤,即使它是然後按字母順序從a到z使房間中的每個人都排成一排,並瀏覽所有織補標籤尋找正確的名字並不是很低效系統很幸運,我們已經準備了一些水桶,所有的水桶都是被標記,因為如果您正在尋找自己的姓名標籤,那會不會很好不要瀏覽整個名稱標籤的完整列表或實際上只是堆疊的內容走到你的水桶,你立即跳到你的名字,我們希望你是只有名字以字母開頭的人,然後您就可以並得到很好的結果我們如何在概念上很好地實現這一點,這很常見如果輸入是單詞或名稱之類的東西,則使用哈希表這些單詞中的字符決定將這些名稱或這些名稱放在何處標籤,如果可以的話,這裏是從0到25的大小為26的數組,但是您知道將數組視為從A到Z進行索引很方便因此仍然有26個存儲桶,但此數組的大小實際上僅為26
0到25最終並假設當前的目標是繼續存儲這些名稱預先標記,所以這是工作人員和我會事先做的,如果瑞安(Ryan),您不介意為此提供幫助,目標很簡單:為學生準備好姓名標籤,所以我想去哪裏前面放第一個,所以Albus是第一個被我們命名為我的名字的人繼續前進並立即跳至零桶並輸入Alba的名字就在一步之內,同時我有了Zacharias,所以即使如果這是一個數組,請帶我一些步驟去這裏我可以像人類一樣隨意訪問,因此我可以立即將Zacharias放在那邊,這樣對我的腳幾乎沒有費力,而是一台計算機可能會跳到零或25或介於兩者之間的任何值好了,所以赫敏,也許你注意到了模式,所以赫敏是將是家務活,這將是7將要結束這里金妮是6在這裏,羅恩(Ron)在17歲,所以在想我的每一個倍數實際上邁出一步的步驟將在這邊進行工作人員和我今天早上討論了我們應該如何投入水桶靠得更近,但是沒關係,西弗勒斯要去這裏矮牽牛會過去嗎Drake過去了但沒關係時間支架三詹姆斯的支架九塞德里克也許是支架二這部分進入X速度Luna是水桶11 Nevel水桶13 Kingsley十桶金斯利,我們去了密涅瓦桶十二弗農我們實際上並不需要這麼多名字來說明我們要提出的觀點但是弗農(Vernon)對我們認可的名字有些不滿,現在列表很完整,這是我最常填寫的一堆名字帶有名稱標籤的水桶,但我氣喘吁籲,但實際上是什麼現在方便的是,如果塞德里克或阿不思或德拉科或弗雷德或金妮來進入房間後,他們可以立即將其隨機索引到自己的桶中,以獲取名字標記並線性化,它們不必遍歷整個堆棧我實際上是從這個故事開始的名字標籤,但是前面有一個問題是的,到目前為止,我們非常有意地對名稱標籤進行了排序,以使我們不會給自己造成問題,但在我們最著名的角色中還沒有聽到哈利的消息,所以哈利的名字仍然在這裏這做得好嗎哈里要去第七,第七桶,但請稍等已經有人在正確的地方,所以如果我只使用一個哈利有點運氣,就像赫敏已經在那兒了陣列,我們將不得不決定赫敏去那裏還是野兔但是我們不能只把它們放在一起,而是如果我們實現這個新的數據結構使用概念上是垂直的數組稱為哈希表,但是水平是長度列表,您知道這很好嗎,我們只是去並把赫敏和哈利聯繫在一起,是的,它將他們或其中之一至少需要兩個步驟來找到他們的姓名標籤,但這不是至少要進行n步的大操作才能找到其名稱標籤海格該死的,這桶裏有兩個人,所以他進來了門也是如此,現在鏈接列表越來越長,我們現在有了一個鏈,如果您要找到大小為三的小天狼星的鍊錶,請點擊這裏和水桶18,但西弗勒斯(Severus)已經在那兒了,尷尬的雷木思(Remus)是17要去和羅恩聯繫在一起,喬治要進入水桶六個在這裏的莉莉也要相撞,可以和露娜說話只要您擁有一個價值,這就是計算機科學中的碰撞您試圖放在一個地方,但那裏有東西您需要以某種方式解決碰撞,所以我建議我們實際上只是將它們鏈接在一起或我們在這裏做兩個桶的價值觀和計算機科學在概念上意味着將值錢,就像我們在這裏所做的那樣,物有所值進入桶11 2,最後將薰衣草放入同一桶中非常感謝Bryan幫助編舞,這樣的結構您正在查看的是所謂的哈希表,它是您索引的數組使用所謂的哈希函數,哈希函數就像任何函數一樣到目前為止,我們所見過的任何程序輸入並產生輸出,因此,如果我們考慮週的原始圖片解決問題時,計算機科學本身是零今天的功能就是處理此功能的功能兩者之間的算法決定給定名稱標籤將該名稱放入哪個存儲區標記,在現實世界中很明顯,我使用的是什麼算法桶在讀名字時注視著名字標籤,看着第一個字母,為什麼很簡單,效率很高,這意味着我可以存儲相對較小的大小為26的數組,並立即在其中放置名稱標籤,因此在這種情況下我們可能已經將Albus輸入該哈希函數,並且它可能返回零代表如果我們要對數組進行零索引或代表Zacharias我們可能會因為他名字的第一個字母是Z而退出25是一種過於簡單的權利,我們已經看到了一個問題當然只是看用戶名字的首字母出現什麼問題,是的,第一個字母可能有多個名稱而且您知道極端情況,計算機科學家和軟件工程師經常想想極端情況,什麼是極端情況,如果會出錯,該怎麼辦?
偶然地,這個宇宙中只有很多角色的名字以H或L開頭,也許它們的所有名稱剛好以H或L開頭哈希表有多花俏都沒關係,如果所有名稱都非常愚蠢標籤被堆疊在一個存儲桶中,因此從某種意義上說,哈希表在最壞的情況下,感覺到n的大O效率非常高插入和搜索,因為您可能會不幸並獲得大量該類的名稱棧只是全部以相同的開頭信,那麼我們如何才能緩解這種情況,我們怎麼才能緩解這種情況呢?什麼,而不是天真的只看名字,讓我們利用一些在這裏,為什麼我們不只看首字母呢?我敢打賭,如果我們看看前兩個字母,我們不會去以獲得與屬於同一桶的人一樣多的碰撞harrion Hagrid是我們之前發現的一個問題,更不用說一些其他名稱,但這是因為我們只在H處查找哈希函數僅以他們名字的第一個字母為例,如果相反,我們看一下前兩個所以我們有一個H
HB HC hdh e
HF的水桶,所以Hermione現在特別是水桶,所以我們將需要更多的水桶,並且它們沒有在圖片上顯示螢幕上也沒有在舞台上合影,我們需要二十多個坦白講,如果要看兩個字母,六個水桶需要26乘以26,例如676現在有更多的空間,但我們希望減少發生碰撞的可能性為什麼我可能在這裏輸入的下一個名字是哈利這次他將以不同的方式結束,這很棒,因為看來現在我可以在恆定時間內訪問他的名字標籤了不幸的是,海格仍然在故事中,所以我們要與H a碰撞,所以即使看前兩個字母也不理想所以即使這個故事我們生了176桶26 26我們仍然會撞到很多水桶,所以可能會發生什麼成為這個想法的下一個演變很好,不要看第一個字母不要看前兩個字母為什麼不看前三個字母肯定會降低不幸的是將舞台上的陣列和存儲桶的單元數增加到10,000這次有很多水桶,所以有很多水桶,但假設我們不使用H a,但可能是8個eh
eh eh eh追逐eh eh
eh eh eh eh
FH G點點h AQ h
AR h AS點點haq h
ER HH e s所以我們有很多桶甚至在這之前,我們可以繼續討論哈利的名字哈格德的名字赫敏的名字,這次是設計使然在不同的存儲桶中似乎有所改善,實際上是因為現在,如果我去尋找和諧,海格或哈利的名字標籤,或者他們本身,他們將能夠在恆定時間內找到它,但這就是假設其他名字以H開頭的孩子不多,因此從技術上講,哈希表仍然是n的大O,因為您可能會不幸並有大量相似的輸入,即使它們產生相同的輸出,即使您正在使用像這樣的更高級的哈希函數,並且需要權衡我天哪,我們現在正使用將近20,000個水桶來存儲這些名稱在某個時候加快速度,讓哈利去可能更便宜和赫敏(Hermione)和海格(Hagrid)排成一行,然後慢慢找到他們的姓名標籤,有時間和空間的權衡,但是如果您有所謂的理想哈希函數,您會發現一些用代碼編寫的神奇算法,確保唯一性,確保沒有名稱標籤會與其他標籤發生衝突可以實現一次恆定時間的大O的聖杯哈希功能之間的這種緊張關係就是您想要多少空間花費多少精力來找出理想的哈希值函數在現實世界中是如此,我們將在大多數計算機的Python中看到這一點系統會盡力使哈希表通常不是n的Big
O實際上平均速度要快得多從理論上講,它可能會變慢,也可能愚蠢,並且CS級別較高當然,您可以更正式地探索數據結構和算法從技術上講,感覺就像搜索可以歸結為一個大O恆定的時間,如果每個名簽都以唯一的存儲桶結尾,但是您仍然可以如果在技術上有很多H名稱或L名稱之類的東西,會變得很不幸說一個哈希表是n的Big O,但坦率地說,桶中的三個名字是赫敏·海格(Hermione Hagrid)和哈利(Harry)比同一個桶中的n個名字好得多,所以即使在現實世界中,如果您擺脫了這種漸近的手紋這比將所有內容放入鏈接列表或數組本身就可以了,所以我敢打賭,我們可以在這裏嘗試另一種方法還有一個我們想用代碼而不是代碼呈現給您的數據結構畫出一個叫做「嘗試短」的嘗試,即使它是發音不同的嘗試是實際上很漂亮的數據結構令人驚奇,並且它遵循這種花費一種資源來節省另一種資源的模式嘗試將使用更多的內存,但是它將為我們提供實際的持續時間查找名稱或單詞等內容結構,所以它看起來有點堅固,因為我們需要離開自己在板上有很多記憶的空間,嘗試一下就是它的節點本質上是一個數組,所以請注意這裏的模式隨着時間的流逝,科學家們很聰明地接受了這個想法將它們混在一起並創建一些怪物數據結構,但這給了您節省了一些時間或空間,因此該數組位於最頂部這個tri的根也是一棵樹,它的節點是數組,並註意為了討論a到Z或0,數組的大小為26如果您想在嘗試中存儲名稱,請嘗試25至25次這種情況是查看有問題的單詞中的每個字母,因此對於HarrietteHAR是為什麼不只看我們的第一,第二或第三看着所有這些,我們要做的是假設人的名字或他們的名字標籤或更普遍的詞是H並轉到該索引,如果沒有子節點,則沒有樹哦,這是另一個分支,如果您要分配另一個節點和另一個節點只是意味着另一個陣列,所以我們現在在板上畫了兩個陣列字母A突出顯示了所有字母,從技術上講,因為當然是0到25,但是我們只突出顯示我們關心的字母為了這個例子,這裏是H a
G,所以看起來像名字我正在嘗試安裝到結構狀態的標籤是Hagrid注意,現在G在該陣列的內部,我想現在轉到我們的海格,這給了我另一個現在,我現在DD是他名字的結尾,所以我將只用綠色上色或者我可以在C代碼中使用布爾標誌,只是說某人的名字結尾在這裏,所以請注意,我現在已經在此數據結構中隱式存儲了海格的名字通過存儲一個節點,該節點是其名稱中每個字母的一個數組,但是存在這裏的效率不高,因為這個故事中還有其他人名稱為前綴或共享公共前綴的海格,例如,假設我想將Harry安裝到此數據結構中,他是H a我們的Y,所以這給了我更多的節點,如果我現在繼續安裝Hermione在這個通知中,我現在在樹中有更多的節點,但是其中一些是如果您從最頂部開始並查看H通知,則共享,這兩個Hagrid哈利和赫敏至少共享一個共同點,這很酷最終,關於這一點的搜索時間是多少?如果現在已經有n個人,則此數據結構N等於3因為即使有很多節點,其中也只有三個人,但是搜索此數據結構以查看其運行時間是他的哈利他的名牌已經有了她的念頭,因為海格(Hagrid)撿起了他的名字,在這些數據中找到Harry,Hermione或Hagrid需要多少步驟哈利的結構很累,所以對於海格來說,最大距離是五個步驟AG RI
D最多六個步驟,然後最多八個步驟,你知道可能是這樣的,如果我們通讀這些書,是某人名字長度的上限我不知道如果是瘋狂的話,大概是二十個字符或者三十個只要您擁有的固定值就是固定值CS和數學中的定義如果為20,則為30,則不固然重要,但這是固定的,人們的名字並不是每年都在增長有一些困難的上限,因此從技術上講,如果只需要您五個或六步或八步找到哈利或海格或哈利或赫敏(Hermione)從技術上講是恆定時間,或者正如我們所說的「大O」,實際上可以真正實現搜索此數據結構的目的真正插入此數據結構,我們稱之為K的Big O,其中K是一些常數,但常數在我們的討論中漸近地是一回事在1的大O的第3週,這些時間實際上是恆定的時間,因為找到哈利,你只看着har R,為什麼有一百萬沒關係已經嘗試過的其他角色,是否有赫敏和海格從數據結構的七本書中分享給其他所有人,因為您正在查看的唯一節點是代表har RY的節點,這是一個到目前為止,我們肯定已經討論過的其他所有算法都具有強大的功能搜索和排序因其他幾個名稱或數字在數據結構中,此處不是這種情況但是要付出的代價似乎是我們要付出的代價獲得非常低的運行時間記憶,我的意思是我的天哪,它幾乎不適合幻燈片,這只是三個名稱,您要花費26個內存現在存儲一個字符,隨着時間的流逝,您會進行一些優化插入很多名稱,其中一些節點將被共享,但這是一個非常可以說是一個非常密集的數據結構,因為它佔用了大量內存為您提供理論上恆定的超驚人運行時間,因此再次,這個權衡的主題將持續到學期在哪裏獲得一種資源,我們將不得不花費另一種資源,所以嘗試一下,事實證明,現在我們有了數組和鍊錶和樹,然後嘗試星期和哈希表以及其他數據結構我們實際上可以使用以下方法實現所謂的抽像數據結構這些都是我們今天的口頭表達圖解地發明了更多的粉紅色拼圖件,然後刮擦這些自定義的拼圖塊,現在我們可以作為構建塊數組和鍊錶以及樹和哈希表,我們可以用來解決其他問題,現實世界中存在的問題之一是稱為Q
a Q,當然在某些文化中介意在現實世界中什麼是Q或它的一個例子在商店,飯店或外賣店,所以Q實際上具有技術在計算機科學中也意味着它是先進先出的數據結構根據定義,先進先出的aq應該有人希望愉快地將一個人排在另一個人的前面,然後先進先出保持此FIFO屬性,以便如果我在最前面我要先行食物,然後是我身後的人,然後他們背後的人,如果你走上去真的會很討厭美味的漢堡下了您的訂單,最近出現的人都得到了他們的食物首先是相反的數據結構那是LIFO在現實世界中的後進先出不公平,所以您可能希望公司喜歡美味漢堡的軟件在他們輸入您的訂單實際發送給那些在後台工作的團隊以排隊的方式烹飪食物,因為這會令人討厭-如果您身後的人首先要獲取食物,因此希望在軟件中您正在實現現實的隊列概念,並在需要時進行打印您仍然在校園打印,有時是紙張,而在打印機通常在校園內共享打印機,因此它們具有所謂的打印機隊列您可以使用命令P或控制P打印,但希望有十個人正在嘗試使用同一台哈佛打印機進行打印是按要求的順序打印的,這很漂亮再次令人討厭的是,如果訂單翻轉得很好,結果隊列中即使我們人類沒有計算機科學,也有兩個基本操作真的用這些術語來思考NQ + DQ-n
Q意味着與DQ保持一致收到打印輸出或食物後,希望能脫機或者不使用今天的原則或凸起的鍊錶,您可能想像從概念上將它們用作實現此概念的基礎美味漢堡或任何快餐店使用的軟件可能已經在代碼中實現了一些使用數組的行可能正在動態調整大小或更好地鏈接隨着人們下訂單和獲得訂單,這種情況正在增長和縮小在今天的一些想法甚至真實的想法之間存在一對一的映射我也提到了一種相反的數據結構到現在為止,這些在現實世界中通常稱為堆棧可能在飯廳裏,就像這裏是一堆托盤,他們有這些根本不同的屬性,例如,如果員工繼續前進,清潔托盤並將其放在此處,如果要拿起您的托盤,將非常令人討厭托盤,您必須經歷FIFO方式,拿到他們放下的第一個紙盤,然後先取出,沒人做如果您在飯廳裏有一大堆托盤,那是現實的您可能先執行後進先出命令,如果這是最先執行的命令最近安裝或清潔的托盤,您可能就像人類一樣即使那對下面的托盤來說不是很公平在這種特殊情況下無關緊要,因此堆棧為您提供了相反的選擇媒體資源,如果您使用Gmail,您可能還會在其他地方看到這些內容默認情況下,您的收件箱最有可能通過Gmail配置為堆棧,最新的電子郵件現在排在頂部,這很不錯,因為它是一個功能而且您總是會看到最新的郵件有點不利一個小時前給您發送電子郵件的朋友,其電子郵件現在在此處第2頁的電子郵件,因此這裏需要權衡取捨。諸如「只取回您的托盤」之類的屬性,就會看到您最近的電子郵件,但如果您像我一樣在電子郵件落入第二頁時就可能永遠都不會回來如果那堆托盤從未真正在那裏被用盡,可能是在校園裏某個飯廳的某個托盤中,這裏從來沒有多年以來一直在使用,因為它們不斷填充紙疊而且我們一直保持領先地位,因此對於許多上下文,但不一定是全部,因此事實證明還有另一個數據結構哦,按照慣例,它們不被稱為NQ和DQ稱為推入和彈出,這意味着將元素甚至推入堆棧如果非常溫柔,則推動彈出意味着刪除頂部元素所以這只是術語,意思是添加和刪除元素,但是有一個其他數據結構將在今天提及,這被稱為字典,我們將在幾週後再次看到Python字典是您可以在哈希表頂部寫的抽象該哈希表從字面上涉及物理存儲桶,並且在代碼中將涉及數組和鏈接列表,就像低級在計算機科學中更普遍地查詢字典是數據結構有鍵和值的單詞和值的單詞和頁碼的東西將一件事映射到人類世界中另一本物理詞典的過程英語詞典中有很多單詞,如果您的單詞拼寫正確文檔,它將在該詞典中,如果您有錯字,請輸入拼寫錯誤您的文檔將不在該詞典中,因此如果您選擇它會不會很好可能實際上可以使用哈希表實現字典,但是很聰明具有很多存儲桶的哈希表,以便您可以回答一個問題,這是一個這個詞是一個超級快的詞,不需要一堆名牌或這種情況下的英語單詞都在同一個桶中,實際上這就是挑戰對於第五個問題,我們將為您提供一個大文本文件,其中包含一百個四萬多個英語單詞,您的目標是實現哈希帶有您選擇的存儲桶數的表以及您選擇的哈希函數並用存儲這些內容的鏈接列表實現數組的這一概念雖然確實存在十四萬多個單詞的字典世界,並於昨晚9:00 pm拍攝,然後甜綠關閉如果您曾經訂購過甜綠色的沙拉,那麼哈佛廣場就是這張照片如果您訂購了一個非常聰明的優化系統,我們可以選擇您的沙拉提前使用他們的應用程序,然後繼續將您的沙拉放在D下給David實例或Brian的B等等,這樣當您進入商店時,不必翻閱其他沙拉的大O即可立即跳至B部分,D部分或任何其他部分,然後在極端的情況也許是哈利和赫敏,海格都同時下令各個年齡段的籌碼量很大,因此從技術上講仍然是n的大O,但是如果您假設一個很好的名稱均勻分佈可能會解決很好,尤其是如果沙拉不是很長一段時間,但是讓我們一起使用最後的幾分鐘來看一看最後的視覺效果由我們其他一些在線朋友製作而成,這些動畫將堆棧和隊列之間的區別的故事如下擬人化從前有個叫傑克的傢伙沒有脖子,所以傑克去找了一個他認識的最受歡迎的傢伙他上廁所,問我該怎麼辦?看到他的朋友真的好心疼,開始只是看看你的衣服傑克,我確定你知道嗎?
來到我家,我會把它們給你看,這樣傑克和傑夫就走了在盒子上放了藍色,他把所有的襯衫,褲子和襪子都放在裏面鬆散的說,我看到你的衣服都堆滿了,為什麼不穿有些人偶爾會說傑克說的好,當我脫下衣服和襪子時,洗淨並放在盒子裏,然後第二天早上起來,我跳我走到箱子前,把衣服放在頂層,很快意識到了這個問題和傑克(Jack)伸手去拿東西時,他把衣服CD和書堆放在一堆讀書或穿衣服時,他會選擇堅固的書或內衣他會把它放回去,它會放在棧頂,我知道解決方案設置了凱旋的魯,您需要學習開始使用提示球管傑克的衣服掛在壁櫥裏,當他清空箱子時,他只是把它扔了,然後他說現在傑克在一天結束時把你的衣服放在當您將它們放開後離開,然後明天早晨當您看到陽光從行尾從右邊開始穿衣服難道你不說你會很好嗎,你會穿一次你穿了兩次,所有東西都排在他的壁櫥裏,架子傑克開始對自己很確定感謝Lou,這是一個很棒的隊列,對於CS50,我們將下次見
你知道子宮脫垂怎么治療嗎?怎么預防呢?有哪些注意事項?
子宮脫垂原因很多,使用子宮托治療可以很好幫助女性。1.子宮托及其作用-子宮托很早就被用來治療子宮脫垂。能使患者自行掌握,但重症子宮脫垂女性私處過度松弛者不宜用托。2.子宮托型號以稍大於生殖(恥骨尾骨肌)裂隙為宜,一般裂隙橫徑以4厘米最多,故...