什么是計算機算法?
算法是計算機可以用來解決特定問題的指令列表潮饱。算法用于計算的所有領(lǐng)域更啄,它們旨在以有效的方式解決問題。
算法的設(shè)計取決于它需要解決的問題的復雜性镀钓。對于簡單的問題穗熬,蠻力可能是可行的。然而丁溅,對于更復雜的問題唤蔗,需要更復雜的算法。
計算機算法無處不在
算法是我們所有數(shù)字生活的支柱窟赏。它們幫助我們更快妓柜、更有效地做出決策。
日常生活中用到的算法例子涯穷,比如谷歌搜索引擎棍掐、亞馬遜推薦系統(tǒng)、Netflix電影推薦系統(tǒng)拷况,算法無處不在作煌!
高效算法和大 O(n):
優(yōu)化過程還取決于算法的類型和復雜性。在某些情況下赚瘦,優(yōu)化算法可能需要幾天或幾周的時間粟誓,而在其他情況下,可能只需要幾小時或幾分鐘起意。
當涉及到 Big O(n) 時鹰服,時間和空間變量是最重要的。算法是軟件工程和計算資源的重要組成部分杜恰。對其性能至關(guān)重要的組件之一是大 O(n) 符號获诈。此短語中的字母 O(n) 限定了特定算法正在執(zhí)行多少操作仍源,其中較小的數(shù)字意味著更快的執(zhí)行時間心褐。還取決于我們談?wù)摰?(n) 數(shù)量舔涎。Big O 專注于最壞的情況。
一項操作的突出之處在于它找到所需結(jié)果的效率逗爹。操作的大小是它對空間的依賴性以檢索所需的結(jié)果亡嫌。
您的操作輸入越多,它就會變得越慢掘而。有幾種不同的常見類型的“大 O”符號表示輸入如何影響操作的效率挟冠。其中包括 O(n)、O(1)袍睡,這是最有效的算法知染,以及 O(log n) 等等……
[圖片上傳失敗...(image-8e00a4-1667142054392)]
算法如何工作?
算法用于對列表指令進行排序并找到給定問題的最佳可能解決方案或最優(yōu)解決方案斑胜。排序算法是數(shù)據(jù)處理中最常用的算法控淡。它們通過保持排序來幫助組織數(shù)據(jù)點,以便可以輕松訪問止潘。
排序算法的不同方法的列表是不完整的掺炭,沒有提到線性排序,它不是真正的算法凭戴,而是一種可以與任何其他排序方法一起使用的技術(shù)涧狮。
可分為簡單和復雜:
- 簡單的排序算法稱為“冒泡排序”和“插入排序”。
- 復雜的排序算法包括“快速排序”么夫、“合并排序”和“堆排序”者冤。
算法的復雜性
該算法可以通過兩種方式來衡量:
算法的時間復雜度
時間復雜度是算法運行時間的上限。它用函數(shù)档痪、漸近符號和常數(shù)值表示譬嚣。這可以寫成方程、圖形或表格的形式钞它,以顯示函數(shù)對自變量的依賴性拜银。O(n) 的時間復雜度意味著該算法將在與 n 個相關(guān)的一系列邏輯步驟中完成。
算法的空間復雜度
空間復雜度是執(zhí)行算法需要多少空間的量度遭垛。算法的空間復雜度可以通過多種方式測量尼桶,包括:迭代次數(shù)、每次操作處理的位數(shù)或每次迭代處理的字數(shù)锯仪。O(n) 算法在輸入大小上是線性的泵督。這意味著它需要與輸入大小相關(guān)的時間,直到某個最大工作量庶喜。
解決問題的多種技術(shù)小腊?
解決問題的方法有很多種救鲤,可以使用不同的標準進行分類。
最常見的類型是:
- 分而治之:是解決問題的聰明方法秩冈。首先本缠,將問題細分為更小的子問題,解決那些更小的問題入问,并將所有解決方案組合成問題的最終解決方案丹锹。
- 蠻力:嘗試所有可能的解決方案,直到找到滿意的解決方案芬失。
- 隨機化:在計算過程中使用隨機數(shù)來找到問題的解決方案楣黍。
- 貪婪:在較小的零件上尋找有效的解決方案,然后將此最佳解決方案擴展到其余零件
- 遞歸:用于通過解決更小棱烂、更簡單的變化來解決問題的更大和更困難的版本租漂。
- 回溯:是一種計算機編程技術(shù),將問題劃分為子問題颊糜,然后將每個問題帶到一個嘗試的解決方案哩治。如果沒有達到所需的解決方案,它將通過找到一條在問題中向前移動的路徑來向后工作芭析。
- 動態(tài)規(guī)劃:專注于解決一系列簡單問題中的復雜問題锚扎,這些問題只解決一次,而不是為每個問題重新計算馁启。在至少計算一次之后驾孔,您需要將其存儲在某個地方以便在必要時重新調(diào)用它
- 指針遍歷或?qū)ぢ罚?/strong>在搜索圖或網(wǎng)絡(luò)時,使用經(jīng)過驗證的搜索算法很重要惯疙。指針遍歷是一種搜索算法翠勉,可用于查找從圖的一個節(jié)點到另一個節(jié)點的最短路徑。例如霉颠,如果我們想使用指針遍歷找到從節(jié)點 1 到節(jié)點 2 的最短路徑对碌,那么我們將首先尋找節(jié)點 1 的最近鄰居,然后蒿偎,如果沒有朽们,則尋找節(jié)點父節(jié)點的最近鄰居
- 哈希表:哈希表算法用于多種用途,例如碰撞檢測和尋路诉位。碰撞檢測是當您要確保兩個對象不相互交叉時骑脱,而尋路是計算兩個或多個點之間的最短距離的過程。
我們遇到了問題
如何用簡單的英語解決它苍糠?
首先要做的是閱讀問題并確保您了解說明要求您做什么叁丧。
接下來,確定問題中給定的所有變量的可能值,并嘗試為每個變量提出一個邏輯解決方案拥娄。
最后蚊锹,試著寫出一個算法,從文字而不是代碼開始稚瘾,寫出每個程序員都知道的被稱為“偽代碼”的東西
什么是偽代碼牡昆?
當我們考慮編程時,經(jīng)常會看到偽代碼孟抗。它是程序員用來設(shè)計算法或另一個系統(tǒng)功能的語言的描述性詞迁杨。
這種編程語言可以使用普通語言的結(jié)構(gòu)約定钻心,但它是為人類閱讀而不是機器閱讀而設(shè)計的凄硼。
算法示例
這是一個例子,說明我們在面對問題時如何思考以及如何解決問題捷沸。
當然這只是我的觀點摊沉,但我希望你能從中得到一些東西。我會從leetcode得到這個問題
這個關(guān)于字謎的問題痒给,字謎是通過重新排列另一個單詞的字母而創(chuàng)建的單詞说墨。新單詞將始終具有原始單詞的所有原始字母,但順序不同苍柏。
示例 1
輸入: strs = [“eat”,”tea”,”tan”,”ate”,”nat”,”bat”]
輸出: [[“bat”]尼斧,[“nat”,“tan”]试吁,[“ate”棺棵,“eat”,“tea”]]
您已閱讀說明熄捍、查看示例并在 Google 上進行了研究烛恤。所有這些都應(yīng)該讓您提前為所請求的內(nèi)容和代碼行中包含的內(nèi)容做好準備。
當然余耽,您仍在嘗試弄清楚如何將其放在代碼中缚柏,但是現(xiàn)在您對解決方案有了一定的了解,您可以著手處理它碟贾。
我的想法逐步過程如下:
1. 我可以從輸入數(shù)據(jù)中得到每個單詞的一個實例币喧。
2. 這個實例應(yīng)該讓它成為默認實例,并且它應(yīng)該被排序袱耽。
3. 同樣杀餐,此默認實例將是收集其他實例的鍵值。
4. 該集合是一個數(shù)組扛邑,其中的這些值來自已排序的鍵值怜浅。
5. 如果我找不到多個實例,那么我將返回我得到的任何實例。
現(xiàn)在讓我們通過想象我們編寫了幾行代碼來進一步分解它恶座。但是這段代碼將是一個偽代碼搀暑。
所以我們需要一種可以存儲鍵值對的表。鍵將是單詞的默認排序?qū)嵗缌眨祵⑹峭粏卧~的相同字符內(nèi)的多個實例值的數(shù)組自点。如果我們找不到相同單詞的任何其他實例,那么我們將其單獨放入數(shù)組中脉让。
所以桂敛,
遍歷輸入數(shù)組
對每個字符串進行排序,使其成為我們上面討論的默認鍵
鍵是否存在于哈希表中溅潜,然后將未排序的版本放入它的值中
如果沒有术唬,則在循環(huán)中使用當前值創(chuàng)建一個數(shù)組
Javascript中的源代碼:
function groupAnagrams(strs) {
//creating the Hash Table
const hashTable = {}
for (let i = 0; i < strs.length; i++){ //Loop through the input list
// Creating the default key by sorting out the value from each string
// To use the Sort method in JS, you need to use it on an array.
// By using the Split() method, you create an array from this current value that you standing on.
// By using the join() method, you recreate the string from the group of characters you created with the split() method above.
const defKey = strs[i].split('').sort().join('')
if (hashTable[defKey]){
//Checking if the hash table has this value if yes, push the current value which is in that case going to be different instance from the sorted default instance.
hashTable[defKey].push(strs[i])
} else {
// if not just initialize it with an array
hashTable[defKey] = [strs[i]]
}
}
//Another great method in JS to help you flat all arrays created in the values of hash Table into one array
return Object.values(hashTable)
};
Python中的源代碼:
def groupAnagrams(strs):
hashTable = {}
for s in strs:
defKey = ''.join(sorted(s))
if defKey in hashTable:
hashTable[defKey].append(s)
else:
hashTable[defKey] = [s]
return hashTable.values()