算法那些事兒

什么是計算機算法?

算法是計算機可以用來解決特定問題的指令列表潮饱。算法用于計算的所有領(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ù)小腊?

解決問題的方法有很多種救鲤,可以使用不同的標準進行分類。

最常見的類型是:

  1. 分而治之:是解決問題的聰明方法秩冈。首先本缠,將問題細分為更小的子問題,解決那些更小的問題入问,并將所有解決方案組合成問題的最終解決方案丹锹。
  2. 蠻力:嘗試所有可能的解決方案,直到找到滿意的解決方案芬失。
  3. 隨機化:在計算過程中使用隨機數(shù)來找到問題的解決方案楣黍。
  4. 貪婪:在較小的零件上尋找有效的解決方案,然后將此最佳解決方案擴展到其余零件
  5. 遞歸:用于通過解決更小棱烂、更簡單的變化來解決問題的更大和更困難的版本租漂。
  6. 回溯:是一種計算機編程技術(shù),將問題劃分為子問題颊糜,然后將每個問題帶到一個嘗試的解決方案哩治。如果沒有達到所需的解決方案,它將通過找到一條在問題中向前移動的路徑來向后工作芭析。
  7. 動態(tài)規(guī)劃:專注于解決一系列簡單問題中的復雜問題锚扎,這些問題只解決一次,而不是為每個問題重新計算馁启。在至少計算一次之后驾孔,您需要將其存儲在某個地方以便在必要時重新調(diào)用它
  8. 指針遍歷或?qū)ぢ罚?/strong>在搜索圖或網(wǎng)絡(luò)時,使用經(jīng)過驗證的搜索算法很重要惯疙。指針遍歷是一種搜索算法翠勉,可用于查找從圖的一個節(jié)點到另一個節(jié)點的最短路徑。例如霉颠,如果我們想使用指針遍歷找到從節(jié)點 1 到節(jié)點 2 的最短路徑对碌,那么我們將首先尋找節(jié)點 1 的最近鄰居,然后蒿偎,如果沒有朽们,則尋找節(jié)點父節(jié)點的最近鄰居
  9. 哈希表:哈希表算法用于多種用途,例如碰撞檢測和尋路诉位。碰撞檢測是當您要確保兩個對象不相互交叉時骑脱,而尋路是計算兩個或多個點之間的最短距離的過程。

我們遇到了問題

如何用簡單的英語解決它苍糠?

首先要做的是閱讀問題并確保您了解說明要求您做什么叁丧。

接下來,確定問題中給定的所有變量的可能值,并嘗試為每個變量提出一個邏輯解決方案拥娄。

最后蚊锹,試著寫出一個算法,從文字而不是代碼開始稚瘾,寫出每個程序員都知道的被稱為“偽代碼”的東西

什么是偽代碼牡昆?

當我們考慮編程時,經(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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滚澜,隨后出現(xiàn)的幾起案子粗仓,更是在濱河造成了極大的恐慌,老刑警劉巖设捐,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件借浊,死亡現(xiàn)場離奇詭異,居然都是意外死亡萝招,警方通過查閱死者的電腦和手機蚂斤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來槐沼,“玉大人曙蒸,你說我怎么就攤上這事∧刚裕” “怎么了逸爵?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凹嘲。 經(jīng)常有香客問我师倔,道長,這世上最難降的妖魔是什么周蹭? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任趋艘,我火速辦了婚禮,結(jié)果婚禮上凶朗,老公的妹妹穿的比我還像新娘瓷胧。我一直安慰自己,他們只是感情好棚愤,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布搓萧。 她就那樣靜靜地躺著杂数,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瘸洛。 梳的紋絲不亂的頭發(fā)上揍移,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音反肋,去河邊找鬼那伐。 笑死,一個胖子當著我的面吹牛石蔗,可吹牛的內(nèi)容都是我干的罕邀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼养距,長吁一口氣:“原來是場噩夢啊……” “哼诉探!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铃在,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤阵具,失蹤者是張志新(化名)和其女友劉穎碍遍,沒想到半個月后定铜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡怕敬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年揣炕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片东跪。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡畸陡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虽填,到底是詐尸還是另有隱情丁恭,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布斋日,位于F島的核電站牲览,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏恶守。R本人自食惡果不足惜第献,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兔港。 院中可真熱鬧庸毫,春花似錦、人聲如沸衫樊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至载佳,卻和暖如春晋被,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刚盈。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工羡洛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人藕漱。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓欲侮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肋联。 傳聞我的和親對象是個殘疾皇子威蕉,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • (2022.10.30 Sun)生成樹(Minimal Spanning Tree,MST)的概念針對連通圖而提出...
    Mc杰夫閱讀 146評論 0 0
  • 基于課堂生根橄仍,助推學生空間觀念發(fā)展——《平行四邊形的面積》研課分析 涂茨小學 史曉艷 一韧涨、教材分析 《平行四邊形的...
    火柴敘事閱讀 151評論 0 0
  • 今天開講單乘多 主講老師徐思源 合并順序記心懷,按某字母降冪來侮繁。 這樣你就不漏項虑粥,結(jié)果自然有序排。 今天@所有人 ...
    千里馬會軍閱讀 199評論 0 0
  • 雷素敏堅持原創(chuàng)分享1623天宪哩。父母的覺醒:身為父母娩贷,我們不能錯誤地認為自己有權(quán)決定孩子是什么樣的人。我們憑什么來評...
    風雨之前閱讀 114評論 0 1
  • 《《好好學習》讀后感 學習其實是對知識進行管理的過程锁孟。什么是知識彬祖,知識不是今天看了一本書,其中的觀點對自己有啟發(fā)品抽,...
    更清新的2023閱讀 54評論 0 0