1. 程式人生 > >資料結構牛客筆記

資料結構牛客筆記

時間複雜度

一個演算法流程中 最壞情況 的,常數運算元量的指標。評價演算法好壞,先看時間複雜度指標,在分析不同資料下的實際執行時間。比如,對於冒泡和和選擇而言,時間複雜度固定為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的專欄】演算法分析_資料結構_解題筆記

專欄達人 授予成功建立個人部落格專欄