數據結構與算法:聊一聊在面試中被常問的那幾個基礎算法的理解

2020-12-27 技頑

上一周的幾篇文章主要分享了有關數據結構相關的知識,有興趣的可以翻回去看一下。前面我也說到:數據結構和算法是一對"相愛相殺的"組合,所以接下來要分享下我個人對於一些算法的理解和實現。本文將主要分享基礎的查找和排序(代碼基於python)

既然要開始分享算法,那必然要先介紹下算法相關的一些基本術語,如下。

01基本術語

穩定性

概念:如果值相同的元素在排序前後保證著排序前的相對位置,則稱為穩定的排序,反之則為不穩定排序,如圖

兩個相同的3的相對位置的區別

主流衡量算法好壞的方法

大O表示法

它表示隨著輸入大小n 的增大,算法執行需要的時間的增長速度可以用 f(n) 來描述,f(n)就是問題規模n的某個函數

幾個經典排序的時間複雜度(平均情況下)和穩定性

冒泡 - O(n) - 穩定排序插入 - O(n) - 穩定排序選擇 - O(n) - 不穩定排序快速 - O(nlog2(n)) - 不穩定排序歸併 - O(nlog2(n)) - 穩定排序術語基本上就差不多了,接下來開始分享算法。

02查找算法

需求:從給定的數組中尋找某個數據

暴力法

暴力法是最符合正常人邏輯的一種算法,總結來說就是窮舉所有可能,然後從所有可能中尋找結果,但是時間複雜度一般比較高。

二分查找

官方定義

二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須採用順序存儲結構,而且表中元素按關鍵字有序排列

理解

二分查找9是否存在的邏輯

代碼實現

03排序算法

算法基本上是面試必問的問題之一了。連最基礎的排序算法也有n多種不同的實現,何況還有更複雜的包括遞歸,動態規劃等等。下面將主要分享幾種非常基礎但是重要的排序算法。

04冒泡排序

冒泡排序是最最最好理解的一種排序算法,但是只會下面的第一種可能不夠,因為面試官很可能會問你有沒有什麼可優化的空間。

冒泡理解

想像一下河裡的水泡,都是由小到大慢慢浮出水面的一種狀態。

是指將列表中的數據從第一個開始,兩兩比較,保證較大的元素排在較小元素的後面,以此類推,直至整個列表中最大的數據已經被放置在了列表的最後一個位置上結束重複上面的步驟,這次比較完的結果應該是列表中倒數第二個數據為次大值,以此類推直至所有元素有序(外部控制循環的次數,為 len(list) - 1次)

動圖來自菜鳥,僅作技術溝通,侵刪

實現

最粗暴的方式

簡單優化版(減少列表有序部分的比較次數)

比如一個無序列表的幾項在調整部分排序後,已經有序了,那麼此時就不需要再進行比較了,程序退出即可。

繼續優化

記錄最後一次交換元素的位置,主要在於後面已經有序的部分不在進行比較

05選擇排序(O(n))

選擇排序的原理

一般來講,每次循環默認選定列表第一個位置為當前列表最大值,將此位置的值和後面的值做比對,如果發現更大的值,則記錄該值的位置,直到遍歷到列表末尾,將末尾的值和最大位置的值交換,這樣最大的值便出現在列表的最後一個位置,以此類推。

所以選擇排序是基於數據的索引進行排序。

動圖來自菜鳥,僅作技術溝通,侵刪

選擇排序的代碼實現

06插入排序

插入排序的原理

將原列表想像成兩部分,前面是已經排好序的,後面是亂序的,依次將亂序部分的每一個數據都和前面排好序的部分進行比較,插入到相應的位置

算法思路

最開始,將列表第一個數據加入到前面部分,這時原列表就可看作第一個數據(排好序部分)和剩下的數據(未排序部分)兩部分,並同時將第二個數據(未排序中的第一個數據)和第一個數據(排好序的最後一個數據)進行比對,根據大小插入到相應的位置,此時有兩個數據已經有序然後將第三個數據(未排序中的第一個數據)和前兩個數據(已經有序的兩個)相比較,並移動比自身更大的數據,排序,這樣便排好3個數據以此類推,直到整個後面部分(未排序)的數據都添加到前面部分(有序)中

動圖來自菜鳥,僅作技術溝通,侵刪

插入排序代碼實現

07總結

本片主要分享了最基礎的關於查找和排序相關算法的原理和實現,包括二分查找,冒泡排序,選擇排序,以及插入排序,這些屬於入門級的算法,後面文章會繼續分享基於遞歸的經典算法"歸併排序以及快速排序"等稍微複雜一點點的排序算法。

我是一名奮戰在編程界的pythoner,工作中既要和數據打交道,也要和erp系統,web網站保持友好的溝通……時不時的會分享一些提高效率的編程小技巧,在實際應用中遇到的問題以及解決方案,或者源碼的閱讀等等,歡迎大家一起來討論!如果覺得寫得還不錯,歡迎關注點讚,謝謝。

相關焦點

  • 程式設計師必知的數據結構與算法基礎:線性表數據結構之數組
    數據結構包括數據對象集以及它們在計算機中的組織方式,即它們的邏輯結構和物理存儲結構,一般我們可以認為數據結構指的是一組數據的存儲結構。2. 算法就是操作數據的方法,即如何操作數據效率更高,更節省資源。這只是抽象的定義,我們來舉一個例子,你有一批貨物需要運走,你是找小轎車來運還是找卡車來運?
  • 計算機專業應數據結構和算法至上?還是與業務掛鈎的技術至上?
    顧名思義,科學與技術是構成這一專業的主要兩個部分,所學課程也主要以這兩部分內容為主,像作業系統、計算機網絡、數據結構與算法等課程都屬於科學側,而web網頁設計、C++程序設計等課程則屬於技術側。數據結構和算法:決定大廠面試成敗的關鍵Pascal之父尼古拉斯·沃斯曾靠一個公式「算法+數據結構=程序」獲得了冠有計算機界諾貝爾獎之稱的圖靈獎。
  • 數據結構與算法在現實中毫無作用?那我們為什麼還要去學習?
    您是否有疑問,如果在現實生活中沒有用,為什麼我應該研究所有上述複雜的東西?如果公司在日常工作中沒有用,為什麼公司會問與數據結構和算法有關的問題? 許多初學者和經驗豐富的程式設計師都避免學習數據結構和算法,因為它很複雜,而且他們認為現實生活中沒有使用上述所有內容。
  • 2020 圖算法工程師面試基礎、要點
    為你總結面試必備的知識要點,助你面試成功。 這段時間面試連連,幾輪下來的感受就是,好點兒的公司對細節摳的很細,希望求職者能夠對使用的算法以及這個算法的其它觸類旁通的領域都能夠有系統的理解。
  • 憑藉清華掃地僧的路線指引,從Java基礎到算法,吊打阿里面試官!
    字節跳動面試總共是3+1面試(技術3面+HR1面),三面技術具體問了什麼題目我是有點分不清了,不過我記得每個知識點大概問了那些問題,大致就是分為Java架構基礎+Redis+Linux/作業系統+HTTPS+MySQL資料庫+算法這六個部分吧,不過話說回來,這次之所以能僥倖過關,多虧了清華掃地僧大佬的學習路線,自己也下了大功夫,也算是功夫不負有心人吧~~~
  • Java實現冒泡排序算法
    1.引子1.1.為什麼要學習數據結構與算法?有人說,數據結構與算法,計算機網絡,與作業系統都一樣,脫離日常開發,除了面試這輩子可能都用不到呀!#理由一:面試的時候,千萬不要被數據結構與算法拖了後腿#理由二: 你真的願意做一輩子CRUD Boy嗎#理由三: 不想寫出開源框架,中間件的工程師,不是好廚子
  • 【數據結構與算法】 通俗易懂講解 二叉堆
    在這個堆中,國王、貴族、騎士和農民是從高到低的優先級。Linux內核中的調度器(scheduler)會按照各個進程的優先級來安排CPU執行哪一個進程。計算機中通常有多個進程,每個進程有不同的優先級(該優先級的計算會綜合多個因素)。內核會找到優先級最高的進程,並執行。如果有優先級更高的進程被提交,那麼調度器會轉而安排該進程運行。優先級比較低的進程則會等待。
  • 算法中的微積分:5大函數求導公式讓你在面試中脫穎而出
    事實上,所有機器學習算法的本質都是數學問題,無論是支持向量機、主成分分析還是神經網絡最終都歸結為對偶優化、譜分解篩選和連續非線性函數組合等數學問題。只有徹底理解數學,才能正真掌握這些機器學習算法。Python中的各種資料庫能幫助人們利用高級算法來完成一些簡單步驟。
  • 為何要打開算法「黑箱」:數據並不正義,算法也難中立
    算法,最初僅用來分析簡單的、範圍較小的問題,輸入輸出、通用性、可行性、確定性和有窮性等是算法的基本特徵。 算法存在的前提就是數據信息,而算法的本質則是對數據信息的獲取、佔有和處理,在此基礎上產生新的數據和信息。簡言之,算法是對數據信息或獲取的所有知識進行改造和再生產。
  • 數據驅動歸因的幾個算法
    Google於2013年推出了Google Analytics Premium的數據驅動歸因模型,並於2014年在AdWords中發布了該模型。數據驅動歸因是基於算法的,要想使用數據驅動歸因,數據量需要積累到一定的規模才可以使用,目前數據驅動歸因可在Google營銷體系中的多個平臺上使用:Google Attribution 360,Google Analytics 360,DoubleClick和AdWords,不同平臺對數據量的要求是不一樣的,如下:算法或機器學習中有兩大類算法
  • 聊自己非計算機專業做程式設計師的經驗
    第一門語言,還是非常建議系統地學一遍,完整地理解下面幾個對新手來說比較陌生的概念,其實但凡是教程,這些東西真的都會有提到:數據類型(Python可能沒有那麼明顯,但是其實報錯看多了大家都很容易理解了)分支(條件)和循環。
  • 資料| 《(中文版)數據結構與算法分析:C 語言描述》
    資料 | 《(中文版)數據結構與算法分析:C 語言描述》
  • 力扣(LeetCode)- 常見的排序算法總結
    常見的排序算法總結4. 排序算法原理描述冒泡排序移動相鄰位置的兩個數據,重複執行。插入排序把數組分為兩個區間,已排序和未排序區間。繼續上述比較過程,直到其中一個子數組中的所有數據都放入臨時數組中,再把另一個數組中的數 據依次加入到臨時數組的末尾,這個時候,臨時數組中存儲的就是兩個子數組合併之後的結果了。最後再把臨時數組 tmp 中的數據拷貝到原數組 A[x...y] 中。穩定排序算法。時間複雜度都是O(nlogn) ,與原始數據是否有序無關。不是原地排序算法。
  • 深入理解YouTube推薦系統算法
    當時YouTube推薦系統的核心算法就是基於Item-CF的協同過濾算法,換句話說就是對於一個用戶當前場景下和歷史興趣中喜歡的視頻,找出它們相關的視頻,並從這些視頻中過濾掉已經看過的,剩下就是可以用戶極有可能喜歡看的視頻。這裡的視頻相關性是用共同點擊個數來描述的。
  • 解析|記錄一切的幕後助手——摘要算法
    雖然摘要算法從發明以來就屬於密碼學範疇,但很少使用「摘要密碼」這種說法(大部分摘要算法的使用都不涉及密鑰),反而是經常被稱為摘要函數。別看它容易用,可一點也不簡單,沒有摘要算法來保障數據完整性,恐怕任何對數據的處理技術都只會越處理導致累積錯誤越多,完全沒有辦法使用。新的區塊鏈系統信任體系,就建立在摘要算法的基礎之上。
  • 程式設計師必備的幾種常見排序算法和搜索算法總結
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言最近為了鞏固一下自己的算法基礎,又把算法書裡的基本算法刷了一遍, 特地總結一下前端工程師需要了解的排序算法和搜索算法知識,雖然還有很多高深算法需要了解
  • 市面上的算法書,公認最好的是這幾本
    但就像老白一直強調莫小貝要扎馬步一樣花拳繡腿可以逞一時之快但只有具備基本的內功才可以華山論劍學會算法最重要的當然是為了裝X過面試啊所以很多人在面試前夕都會60倍拿支付來說朱贇面對如何壓縮信用卡的bin data以免bug的問題時也需要用到算法 計算機受人類青睞不就是因為人家快嘛那既然算法可以有效地進行數據優化你們為什麼還要嫌棄它!
  • 算法之「算法」:所有機器學習算法都可以表示為神經網絡
    直覺上,我們可以通過幾個例子理解,更嚴謹地講,這種說法也可以通過數學方法證明。我們先來定義一下什麼是神經網絡:它是一個體系結構,包括輸入層、隱藏層和輸出層,各層的節點之間互相連接。信息通過線性變換(權重和偏置)和非線性變換(激活函數)從輸入層轉換到輸出層,有一些方法可以更新模型的可訓練參數。
  • 機器學習算法的新女王——XGBoost
    XGBoost是基於決策樹的集成機器學習算法,使用了梯度提升框架。在涉及非結構化數據(圖像、文本等)的預測問題中,人工神經網絡往往優於所有其他算法或框架。然而,當涉及到中小型結構化/表格數據時,基於決策樹的算法被認為是目前同類中最好的。請參閱下表了解這些年來基於樹的算法的發展。
  • 感謝支持 | 九章算法 實習生招募
    旗下產品包括:九章算法 www.jiuzhang.com幫助更多中國人找到好工作,矽谷面試求職門戶,中文IT線上教育領先品牌。招聘要求(算法類助教):1. 熟練掌握基礎的算法和數據結構,有ACM競賽背景,有獲獎經歷的優先2. 紮實的編程能力;標準:可以做出LintCode中等難度以上題目(https://www.lintcode.com/)3. 至少熟練掌握Java、C++、Python其中一項,其他的基本語法了解、且願意主動學習4.