【數據結構與算法面試入門】算法的基礎概念

Q1:算法(Algorithm)是什麼?

算法

1 一個有限的指令集
2.接受一些輸入(有些情況不需要輸入)
3.產生輸出
4.一定在有限步驟之後終止
不同於程序,操作系統的程序可以一直運行。
5.每一條指令必須
有充分明確的目標不可以有歧義,要在計算機處理範圍內,描述不依賴任何一種計算機語言,要抽象。

【考點】僞代碼的書寫
選擇排序算法的僞代碼(Pseudocode)描述
僞代碼算法中的註釋被括在 /* */ 之中,一定要抽象。
在這裏插入圖片描述

Q2:什麼是好的算法?

算法的效率

衡量算法的好壞是與時間複雜度和空間複雜度息息相關的。

在這裏插入圖片描述計算機中計算加減法的速度是可以忽略不計的,我們衡量這兩個函數的快慢可以只關注乘除法的次數。第一個函數冪指數乘法i-1次,外面有一個乘法,一次循環有i次乘法。總共會有n2+n2\frac{n^2+n}{2}個乘法。第二個函數一次循環只有一個乘法,共有n次。所以我們用時間複雜度來描述這兩個函數的話,T1(n)=C1n2+C2nT_1(n)=C_1n^2+C_2nT2(n)=CnT_2(n)=Cn

在分析算法的效率時,我們一般會關注兩種複雜度,一種是平均複雜度,一種是最壞情況複雜度。“平均”其實是不容易度量的,所以一般我們更喜歡分析最壞情況複雜度。

分析“二分法”

查找算法中的“二分法”是這樣定義的:給定N個從小到大排好序的整數序列List[],以及某待查找整數X,我們的目標是找到X在List中的下標。即若有List[i]=X,則返回i;否則返回-1表示沒有找到。
二分法是先找到序列的中點List[M],與X進行比較,若相等則返回中點下標;否則,若List[M]>X,則在左邊的子系列中查找X;若List[M]<X,則在右邊的子系列中查找X。
試寫出算法的僞碼描述,並分析最壞、最好情況下的時間、空間複雜度。

第一次寫的僞代碼有點傻兮兮的,嗚嗚嗚。

int binarySearch(int List[],int X,int N)
	middle=searchmiddle(List[],0,N-i);
	/*尋找二分點*/
	if(middle = X)
		return middle
	else
		while(not middle=X)
			if(middle<X) middle = searchmiddle(List[],middle,N-1)
			else middle = searchmiddle(List[],0,middle)

最好的情況一定是在二分點上就是我們要找的數字,複雜度爲1.最壞的情況是在兩邊,複雜度是log(n),對數指數形式。我感覺自己不會正規表達複雜度,不開心(

Q3:複雜度的漸進表示法
我們最關心的無非是隨着我們要處理的數據規模增大後,我們的複雜度是怎樣變化的。

複雜度的漸進表示法

【考點】複雜度的表示

在這裏插入圖片描述我們一般要找到最小的上界和最大的下界。上下界雖說有無數個,我們還是希望找到的是最貼近真實情況的那一個。

下圖爲各種函數的增長性質:
在這裏插入圖片描述今日寫文背景音樂《沒那麼難》

沒那麼難
做個選擇沒那麼難
都是溫溫暖暖的
零零散散的期盼
沒那麼難
做個決定沒那麼難
無非日日夜夜的
也平平淡淡的勇敢
人們猶猶豫豫
錯過了許多圓滿
總是不知所措
匆匆忙忙 卻心煩意亂
其實 沒那麼難
一個微笑 真的 沒那麼難
不知不覺中
我們終會把眼淚擦乾
其實 沒那麼難
一個承諾 真的 沒那麼難
曾經的遺憾 又怎麼會
代表如今 要和誰相伴
沒那麼難
每個答案沒那麼難
不過起起伏伏的
才真真切切的釋然
沒那麼難
做個決定沒那麼難
無非日日夜夜的
也平平淡淡的勇敢
人們猶猶豫豫
錯過了許多圓滿
總是不知所措 匆匆忙忙
卻心煩意亂
其實 沒那麼難
一個微笑 真的 沒那麼難
不知不覺中
我們終會把眼淚擦乾
其實 沒那麼難
一個承諾 真的 沒那麼難
曾經的遺憾
又怎麼會 代表如今
其實 沒那麼難
一個擁抱 真的 沒那麼難
我們的時光
原來不值得與孤單糾纏
其實 沒那麼難
愛一個人 真的 沒那麼難
即使會受傷 會聚散
都是生命裏最好的片段

數據結構核心原理與算法應用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章