演算法基礎 第一章 認識複雜度和簡單排序演算法

2021-09-12 11:07:03 字數 2477 閱讀 5128

回顧一下演算法方面的基礎知識:

-- 時間複雜度和空間複雜度 選擇排序、氣泡排序、插入排序的細節和時間複雜度分析

-- 二分法的使用和複雜度分析

-- 一道時間複雜度很低的利用異或運算解決的問題

-- 常見時間複雜度的比較

-- 詳解遞迴函式與常見遞迴函式的複雜度估算(master公式)

--詳解對數器的使用

認識時間複雜度

常數操作(與資料量沒有關係,固定時間):陣列定址操作(記憶體跳一下時間),加減乘除(整型32位),位運算

時間複雜度:乙個演算法流程中常數運算元量的指標。

(m*n)*o(1):2個for迴圈的遍歷

評價演算法的指標:先看時間複雜度的指標,然後再分析不同資料樣本下的實際執行時間,也就是常數項時間。

二分

[二分法通常用於二分查詢。所謂二分,其實就是每次與有序序列中的中值比較,如果比中值小,則去中值的左邊序列中查詢,如果比中值大,則去中值的右邊序列中查詢,如果與中值相等,則查詢成功。就這樣按照上面的步驟迴圈查詢,直到找到或者序列長度為1為止。]

冒泡: 演算法思想就是氣泡往上冒的樣子,2個2個比較,冒一次排好乙個數,再冒第二次...

[在長度為n的序列中,每次遍歷整個序列,比較前後兩個元素,如果後面的這個元素比前面的這個元素小,交換兩個元素,這樣多次遍歷後,知道序列有序。]

選擇:第1趟,在待排序記錄r[1]~r[n]中選出最小的記錄,將它與r[1]交換;第2趟,在待排序記錄r[2]~r[n]中選出最小的記錄,將它與r[2]交換;以此類推,第i趟在待排序記錄r[i]~r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢

[在長度為n的序列中,每次遍歷n-i次序列,(i=0,1,2,... ,n)將序列後(n-i)個元素中最大/小的元素放到第i個位置上。]

插入排序:撲克牌整牌,抽到一張牌,排序

插入排序與資料狀況有關係,冒泡和選擇與資料狀況無關係。插入在有序下o(n),無序

[在長度為n的序列中,將序列第 i 個元素有序地插入到前(i-1)個已經有序的元素中,直到序列有序。]

一道時間複雜度很低的利用異或(^)運算解決的問題:

整數型陣列中,每個元素均出現兩次,除了乙個元素例外,如何找出這個元素?能否設計乙個線性時間的演算法,且不需要額外的儲存空間?

使用異或運算子(^)可以o(n)的時間複雜度解決這個問題。

異或運算子的特點是:數a兩次異或同乙個數b(a=a^b^b)仍然為原值a。對於任何數x,都有x^x=0,x^0=x。

其實o(n)的演算法不容易一下子想到,先說說常規的解決思路,有如下兩種:

1、對元素的出現次數進行統計,可進行n*n迴圈,判斷元素是否只出現了一次。這樣時間複雜度為o(n^2), 不需要額外空間。

2、先對元素進行排序,然後進行相鄰兩元素的對比,如a1和a2對比,a3和a4對比,如果不同,則前乙個元素(a1、a3)就是所要查詢的元素。這樣的時間複雜度還是比o(n)高。

這兩種解法的時間複雜度都比o(n)更高。但是,如果你運用了異或運算子的特點,那麼這個問題就很容易解決了,演算法複雜度為o(n),且不需要額外空間,像這樣:

int singlenumber(int a, int n) )+o(n^)" class="mathcode" src=""/>

t(n/b):子過程樣本量  a:子過程幾次  n^d:剩下的過程

1) log(b,a) > d -> 複雜度為o(n^log(b,a))

2) log(b,a) = d -> 複雜度為o(n^d * logn)

3) log(b,a) < d -> 複雜度為o(n^d)

歸併排序的細節與複雜度分析

時間複雜度o(n*logn),額外空間複雜度o(n)

左右側分別排序,整體外排。

5 3 6 | 2 0 1  -->  3 5 6 | 0 1 2  準備輔助陣列外排

小和問題和逆序對問題(歸併排序解決)

小和問題

在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。求乙個陣列的小和。

例子:[1,3,4,2,5]

1左邊比1小的數,沒有;

3左邊比3小的數,1;

4左邊比4小的數,1、3;

2左邊比2小的數,1;

5左邊比5小的數,1、3、4、2;

所以小和為1+1+3+1+1+3+4+2=16

13 4 |25

當前數是cur,右側有多少數比當前數大 x個cur

逆序對問題

在乙個陣列中,左邊的數如果比右邊的數大,則折兩個數構成乙個逆序對,請列印所有逆序對。

第一章作業2 演算法時間複雜度和空間複雜度

一 判斷題 1 1 演算法分析的兩個主要方面是時間複雜度和空間複雜度的分析。t 1 2 n 2logn和nlogn 2具有相同的增長速度。f 1 3 2 n和n n具有相同的增長速度。f 1 4 100logn是o n 的。我覺得這個題目應該是錯誤的,因為時間複雜度的計算主要是要看n,而如果n很大這...

演算法基礎第一章

不同常數時間的操作 加或定址運算或位運算 執行時間不一樣 選擇最小的數,放到陣列的第乙個位置 時間複雜度 c n c n 1 c n 2 c 1 o n 2 額外空間複雜度 o 1 兩兩比較並交換,直到無交換 時間複雜度 o n 2 額外空間複雜度 o 1 左邊序列有序,右邊新加入乙個數,從右往左找...

第一章 基礎演算法(一)

題目 給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。對於每個查詢,返回乙個元素k的起始位置和終止位置 位置從0開始計數 如果陣列中不存在該元素,則返回 1 1 輸入格式 第一行包含整數n和q,表示陣列長度和詢問個數。第二行包含n個整數 均在1 10000範圍內 表示完整陣列。接下來q...