資料結構牛客筆記
時間複雜度
一個演算法流程中 最壞情況 的,常數運算元量的指標。評價演算法好壞,先看時間複雜度指標,在分析不同資料下的實際執行時間。比如,對於冒泡和和選擇而言,時間複雜度固定為O(n2),而對於插入排序最好的情況為O(n),最壞情況為O(n2),一般都是取最壞情況作為演算法的時間複雜度。
常數操作
操作與資料量大小無關。
對數器
1、有一個待測的方法a
2、實現一個絕對正確但複雜度不好的方法b
3、實現一個隨機樣本產生器
4、把方法a和方法b比對很多次來驗證a是否正確
5、如果有一個樣本比對出錯,列印樣本分析是哪個出錯
6、當樣本數量很多時比對也依然正確,則方法a正確
這個用於筆試,或者網上oj不靠譜的情況,要提前準備好模板,來驗證正確與否。
遞迴的剖析
所謂遞迴函式就是系統棧的使用。
遞迴的複雜度分析:
master公式只能用在劃分的子集規模一樣的情況下。
使用的例子:歸併排序
作業
1、完成冒泡、選擇、插入、歸併排序,並記好他們對應的時間複雜度。
2、完成小和問題。
作業完成
1、氣泡排序
先看自己完成的版本。
package niuke;
import java.util.Arrays;
public class bubbleSort {
//氣泡排序,從小到大排序
public static void bubblesort(int[] arr) {
if(arr.length <=1)
return;
for(int i = 0; i < arr.length-1; i++) {
for(int j = 0; j < arr.length-i-1; j++) {
if(arr[j] > arr[j+1]) {
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
//列印陣列,測試用。
public static void printarr(int[] arr) {
for(int i = 0; i <= arr.length-1; i++) {
System.out.print(arr[i] + " ");
}
System.out.println(" ");
}
//運用對數器測試氣泡排序,正確列印Nice,錯誤列印Fucking Fucked。
public static void main(String[] args) {
int[] res = {0,0,0,0,0,0,0,0,0,0};
int[] res1 = {0,0,0,0,0,0,0,0,0,0};
for(int i = 0; i < 10; i++) {
int ran = (int) (Math.random()*10 +8) - (int) (Math.random()*10 +2);
res[i] = ran;
res1[i] = ran;
}
bubblesort(res);
Arrays.sort(res1);
if(Arrays.equals(res, res1))
System.out.println("Nice!");
else System.out.println("Fucking Fucked");
}
}
顯然,氣泡排序時間複雜度嚴格為O(n2),與資料量無關。
2、選擇排序
首先還是自己完成的版本。
package niuke;
import java.util.Arrays;
public class chooseSort {
public static void choosesort(int[] arr) {
if(arr.length <= 1)
return;
int j,i;
for(i = 0; i <= arr.length-1; i++) {
int maxindex = i;
for(j = i+1; j <= arr.length-1; j++) {
if(arr[j] < arr[maxindex]) {
int tmp = arr[j];
arr[j] = arr[maxindex];
arr[maxindex] = tmp;
}
}
}
}
public static void printarr(int[] arr) {
for(int i = 0; i <= arr.length-1; i++) {
System.out.print(arr[i] + " ");
}
System.out.println(" ");
}
public static void main(String[] args) {
int[] res = {0,0,0,0,0,0,0,0,0,0};
int[] res1 = {0,0,0,0,0,0,0,0,0,0};
for(int i = 0; i < 10; i++) {
int ran = (int) (Math.random()*10 +8) - (int) (Math.random()*10 +2);
res[i] = ran;
res1[i] = ran;
}
Arrays.sort(res1);
//printarr(res1);
choosesort(res);
//printarr(res);
if(Arrays.equals(res, res1))
System.out.println("Nice!");
else System.out.println("Fucking Fucked");
}
}
同樣,每次都要遍歷陣列,固定為O(n2),並且不隨著資料量增加而改變。
3、插入排序
首先看看自己寫的程式碼。
package niuke;
import java.util.Arrays;
public class insertSort {
//插入排序,i是被比較的。
public static void insertsort(int[] arr) {
if(arr.length <= 1)
return;
for(int i = 1; i <= arr.length-1; i++) {
for(int j = i-1; j >=0 && arr[j] > arr[j + 1]; j--) {
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
//for test
public static void printarr(int[] arr) {
for(int i = 0; i <= arr.length-1; i++) {
System.out.print(arr[i] + " ");
}
System.out.println(" ");
}
//for test
public static void main(String[] args) {
int[] res = {0,0,0,0,0,0,0,0,0,0};
int[] res1 = {0,0,0,0,0,0,0,0,0,0};
for(int i = 0; i < 10; i++) {
int ran = (int) (Math.random()*10 +8) - (int) (Math.random()*10 +2);
res[i] = ran;
res1[i] = ran;
}
Arrays.sort(res1);
printarr(res1);
insertsort(res);
printarr(res);
if(Arrays.equals(res, res1))
System.out.println("Nice!");
else System.out.println("Fucking Fucked");
}
}
4、歸併排序
package niuke;
import java.util.Arrays;
public class mergeSort {
public static void Mergesort(int[] arr) {
if(arr.length <=1) {
return;
}
Mergesort(arr,0,arr.length-1);
}
public static void Mergesort(int[] arr,int lindex,int rindex) {
if(lindex == rindex) {
return;
}
int middle = (rindex + lindex)/2;
Mergesort(arr,lindex,middle);
Mergesort(arr,middle+1,rindex);
merge(arr,lindex,middle,rindex);
}
public static void merge(int[] arr, int l, int m, int r) {
int[] help = new int[r - l + 1];
int i = 0;
int p1 = l;
int p2 = m + 1;
while (p1 <= m && p2 <= r) {
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= m) {
help[i++] = arr[p1++];
}
while (p2 <= r) {
help[i++] = arr[p2++];
}
for (i = 0; i < help.length; i++) {
arr[l + i] = help[i];
}
}
//for test
public static void printarr(int[] arr) {
for(int i = 0; i <= arr.length-1; i++) {
System.out.print(arr[i] + " ");
}
System.out.println(" ");
}
//for test
public static void main(String[] args) {
int[] res = {0,0,0,0,0,0,0,0,0,0};
int[] res1 = {0,0,0,0,0,0,0,0,0,0};
for(int i = 0; i < 10; i++) {
int ran = (int) (Math.random()*10 +8) - (int) (Math.random()*10 +2);
res[i] = ran;
res1[i] = ran;
}
Arrays.sort(res1);
printarr(res1);
Mergesort(res);
printarr(res);
if(Arrays.equals(res, res1))
System.out.println("Nice!");
else System.out.println("Fucking Fucked");
}
}
5、小和問題
package niuke;
import java.util.Arrays;
public class xiaheproblem {
public static int mergesort(int[] a) {
if(a.length <= 1)
return 0;
return mergesort(a, 0, a.length-1);
}
public static int mergesort(int[] a, int lindex, int rindex) {
if(rindex == lindex)
return 0;
int mid = (rindex + lindex)/2;
mergesort(a, lindex, mid);
mergesort(a, mid+1 , rindex);
return mergesort(a, lindex, mid) + merge(a, lindex, mid, rindex) + mergesort(a, mid+1 , rindex);
}
public static int merge(int[] arr, int l, int m, int r) {
int[] help = new int[r - l + 1];
int i = 0;
int p1 = l;
int p2 = m + 1;
int res = 0;
while (p1 <= m && p2 <= r) {
res += arr[p1] < arr[p2] ? (r - p2 + 1) * arr[p1] : 0;
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= m) {
help[i++] = arr[p1++];
}
while (p2 <= r) {
help[i++] = arr[p2++];
}
for (i = 0; i < help.length; i++) {
arr[l + i] = help[i];
}
return res;
}
//for test
public static void main(String[] args) {
int re = 0;
int[] res = {
相關推薦
資料結構牛客筆記2
隨機快排
時間複雜度O(N*logN)
空間複雜度O(logN):最好情況為O(logN),二分法打斷點;最壞情況下為O(N),每個都要打斷點。
樣本狀況
一個樣本狀況會導致演算法的複雜度有所變化,可以採用兩種方法:
1、隨機樣本選取來劃分
2、雜湊函式
堆
資料結構牛客筆記
時間複雜度
一個演算法流程中 最壞情況 的,常數運算元量的指標。評價演算法好壞,先看時間複雜度指標,在分析不同資料下的實際執行時間。比如,對於冒泡和和選擇而言,時間複雜度固定為O(n2),而對於插入排序最好的情況為O(n),最壞情況為O(n2),一般都是取最壞情況作為演算法的時間複雜度。
資料結構-樹的筆記
#include <stdio.h>
#include <stdlib.h>
//節點宣告,資料域、左指標、右指標
typedef struct BiTNode
{
int data;
struct BiTNode *Left,*Right;
}BiTNo
資料結構--線性表筆記
一 、線性表的定義 :零個或多個數據元素的
二、線性表的抽象資料型別
三、線性表的順序儲存結構
1、資料長度和線性表長度的區別
一)、順序儲存結構的插入與刪除
1、插入操作
2、刪除操作
&nb
資料結構與演算法筆記(二)複雜度分析
2. 複雜度分析
2.1 什麼是複雜度分析
資料結構和演算法的本質:快和省,如何讓程式碼執行得更快、更省儲存空間。
演算法複雜度分為時間複雜度和空間複雜度,從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。
複雜度描述的是演算法執行時間(或佔用空間)與資料規模的增長關
資料結構與演算法筆記(三)陣列
3.陣列
陣列(Array)是一種線性表資料結構。它是一組連續的記憶體空間,來儲存一組具有相同型別的資料。
3.1 特性
線性表 資料排成像一條線的結構,如陣列、連結串列、佇列、棧等。 與之相對立的是非線性,如二叉樹、堆、圖等,其資料之間並不是簡單的前後關係。
【大話資料結構】01 資料結構的緒論 筆記
《大話資料結構》
——程傑 共463頁
筆記圈點主要內容,也請多多支援大話資料結構該書作者。
第 1 章 資料結構的緒論
26頁_開場白
28頁_基本概念和術語
資料結構課程
是一門研究非
資料結構課上筆記2
今天繼續說明了一些基本概念,講解了時間空間複雜度。
(對於概念的掌握也很最重要)
元素之間的關係在計算機中有兩種表示方法:順序映像和非順序映像,由此得到兩種不同的
儲存結構:順序儲存結構和鏈式儲存結構。
順序:根據元素在儲存器中的相對位置表示關係
鏈式:藉助指標
資料結構與演算法筆記(三)反轉部分連結串列
反轉部分連結串列
上次我們搞定了反轉單向連結串列和雙向連結串列的問題,但實際過程中我們可能只要反轉部分連結串列,在這種情況下我們需要對上次寫出的類增加一個叫做reverse_part_linklist的函式,傳入引數為兩個整數from和to,將from到to之間的節點進行反轉
javascript資料結構與演算法筆記(一):棧
javascript資料結構與演算法筆記(一):棧
一:簡介
二:ES6版Stack類(陣列)
三:ES版Stack類私有屬性的封裝
1.偽私有屬性封裝
2.真私有屬性封裝
資料結構第一章筆記
連結儲存結構:用一組任意
的儲存單元儲存資料元素,數
據元素之間的邏輯關係用指標
來表示 。
例:(bat, cat, eat)
1.3 資料結構的基本概念
資料結構的基本概念
0200
0208
0300
0325
…
…
…
…
bat
0200
cat
0325
eat
∧
邏輯結構和儲存結構之間的關係
資料結構第二章筆記
第二章線性表本章的基本內容是:
線性表的邏輯結構
線性表的順序儲存及實現
線性表的連結儲存及實現
順序表和單鏈表的比較
線性表的其他儲存及實現學生成績登記表
學號 姓 名 資料結構 英語 高數
0101 丁一 78 96 87
0102 李二 90 8
《大話資料結構》讀書筆記(2)
這一篇再來說說我對於串的理解。
字串是我們經常會用到的一種資料型別,它可以表示為一個字元陣列。
1、資料型別
對於字串的操作會有很多,但其中非常核心則是比較、拼接、擷取、索引和替換,都是圍繞子串一些操作。
2、儲存結構
因為字串實質上是一個字元陣列
Java常用資料結構(個人筆記)
寫在前面:
樓主剛打完ACM徐州現場賽,也算是退役了,現在準備重新補一遍Java,之前一直用的是C++,所以我會結合C++來整理Java的資料結構,同時也便於理解。
那麼我將按照以下順序進行講解,感覺難度也是逐步提升
ArrayList、Vector和Lin
資料結構課上筆記15
圖的儲存
多重連結串列:完全模擬圖的樣子,每個節點內的指標都指向該指向的節點。
節點結構內指標數為度
缺點:浪費空間、不容易操作
陣列表示法(鄰接矩陣表示法)
可用兩個陣列儲存。其中一個 一維陣列儲存資料元素(頂點)的資訊,另一個二維
資料結構課上筆記11
滿二叉樹 (Full binary tree)
除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點二叉樹。
國內教程定義:一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數為K,且結點總數是(2^k) -1 ,則它就是滿二叉樹。
資料結構課上筆記14
圖是一種: 資料元素間存在多對多關係的資料結構 加上一組基本操作構成的抽象資料型別。
圖 (Graph) 是一種複雜的非線性資料結構,由頂點集合及頂點間的關係(也稱弧或邊)集合組成。可以表示為: G=(V, VR)
其中 V 是頂點的有窮非空集
資料結構課上筆記13
樹儲存結構
父節點表示法
資料域:存放結點本身資訊。
雙親域:指示本結點的雙親結點在陣列中的位置。
對應的樹:
/* 樹節點的定義 */
#define MAX_TREE_SIZE 100
typedef struct{
資料結構課上筆記12
二叉樹的儲存結構
順序儲存結構
完全二叉樹:用一組地址連續的 儲存單元依次自上而下、自左至右存 儲結點元素,即將編號為 i 的結點元 素儲存在一維陣列中下標為 i –1 的分量中。
一般二叉樹:將其每個結點與完 全二叉樹上的
【wuzhekai的專欄】演算法分析_資料結構_解題筆記
專欄達人
授予成功建立個人部落格專欄