導航:首頁 > 文檔加密 > 選擇排序實現加密

選擇排序實現加密

發布時間:2024-04-03 09:39:24

⑴ 甯歌佺殑鈥滈夋嫨鍔犲瘑鈥濈畻娉曟湁鍝浜涳紵

瀵圭О鍔犲瘑綆楁硶錛堢樺瘑閽ュ寵鍔犲瘑錛夊拰闈炲圭О鍔犲瘑綆楁硶錛堝叕寮瀵嗛掗鍔犲瘑錛夈

瀵圭О鍔犲瘑綆楁硶鐢ㄦ潵瀵規晱鎰熸暟鎹絳変俊鎮榪涜屽姞瀵嗭紝甯哥敤鐨勭畻娉曞寘鎷錛
DES錛圖ata Encryption Standard錛夛細鏁版嵁鍔犲瘑鏍囧噯錛岄熷害杈冨揩錛岄傜敤浜庡姞瀵嗗ぇ閲忔暟鎹鐨勫満鍚堛
3DES錛圱riple DES錛夛細鏄鍩轟簬DES錛屽逛竴鍧楁暟鎹鐢ㄤ笁涓涓嶅悓鐨勫瘑閽ヨ繘琛屼笁嬈″姞瀵嗭紝寮哄害鏇撮珮銆
AES錛圓dvanced Encryption Standard錛夛細楂樼駭鍔犲瘑鏍囧噯錛屾槸涓嬩竴浠g殑鍔犲瘑綆楁硶鏍囧噯錛岄熷害蹇錛屽畨鍏ㄧ駭鍒楂橈紱
AES
甯歌佺殑闈炲圭О鍔犲瘑綆楁硶濡備笅錛
RSA錛氱敱 RSA 鍏鍙稿彂鏄庯紝鏄涓涓鏀鎸佸彉闀垮瘑閽ョ殑鍏鍏卞瘑閽ョ畻娉曪紝闇瑕佸姞瀵嗙殑鏂囦歡鍧楃殑闀垮害涔熸槸鍙鍙樼殑錛
DSA錛圖igital Signature Algorithm錛夛細鏁板瓧絳懼悕綆楁硶錛屾槸涓縐嶆爣鍑嗙殑 DSS錛堟暟瀛楃懼悕鏍囧噯錛夛紱
ECC錛圗lliptic Curves Cryptography錛夛細妞鍦嗘洸綰垮瘑鐮佺紪鐮佸︺
鏁e垪綆楁硶

⑵ 風靡全球的十大演算法

作者 | George Dvorsky

編譯 | 深度學習這件小事

1 排序演算法

所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法。排序演算法在很多領域得到相當地重視,尤其是在大量數據的處理方面。一個優秀的演算法可以節省大量的資源。

穩定的

冒泡排序(bubble sort) — O(n^2) 雞尾酒排序(Cocktail sort,雙向的冒泡排序) — O(n^2) 插入排序(insertion sort)— O(n^2) 桶排序(bucket sort)— O(n); 需要 O(k) 額外空間 計數排序(counting sort) — O(n+k); 需要 O(n+k) 額外空間 合並排序(merge sort)— O(nlog n);需要 O(n) 額外空間 原地合並排序— O(n^2) 二叉排序樹排序 (Binary tree sort) — O(nlog n)期望時間; O(n^2)最壞時間;需要 O(n) 額外空間 鴿巢排序(Pigeonhole sort)— O(n+k); 需要 O(k) 額外空間 基數排序(radix sort)— O(n·k); 需要 O(n) 額外空間 Gnome 排序— O(n^2) 圖書館排序— O(nlog n) withhigh probability,需要(1+ε)n額外空間

不穩定的

選擇排序(selection sort)— O(n^2) 希爾排序(shell sort)— O(nlog n) 如果使用最佳的現在版本 組合排序— O(nlog n) 堆排序(heapsort)— O(nlog n) 平滑排序— O(nlog n) 快速排序(quicksort)— O(nlog n) 期望時間,O(n^2) 最壞情況;對於大的、亂數列表一般相信是最快的已知排序 Introsort—O(nlog n) Patience sorting— O(nlog n+k) 最壞情況時間,需要額外的 O(n+ k) 空間,也需要找到最長的遞增子串列(longest increasing subsequence)

不實用的

Bogo排序— O(n× n!) 期望時間,無窮的最壞情況。 Stupid sort— O(n^3); 遞歸版本需要 O(n^2)額外存儲器 珠排序(Bead sort) — O(n) or O(√n),但需要特別的硬體 Pancake sorting— O(n),但需要特別的硬體 stooge sort——O(n^2.7)很漂亮但是很耗時

2 傅立葉變換與快速傅立葉變換

傅立葉是一位法國數學家和物理學家,原名是JeanBaptiste Joseph Fourier(1768-1830), Fourier於1807年在法國科學學會上發表了一篇論文,論文里描述運用正弦曲線來描述溫度分布,論文里有個在當時具有爭議性的決斷:任何連續周期信號都可以由一組適當的正弦曲線組合而成。當時審查這個論文拉格朗日堅決反對此論文的發表,而後在近50年的時間里,拉格朗日堅持認為傅立葉的方法無法表示帶有稜角的信號,如在方波中出現非連續變化斜率。直到拉格朗日死後15年這個論文才被發表出來。誰是對的呢?拉格朗日是對的:正弦曲線無法組合成一個帶有稜角的信號。但是,我們可以用正弦曲線來非常逼近地表示它,逼近到兩種表示方法不存在能量差別,基於此,傅立葉是對的。為什麼我們要用正弦曲線來代替原來的曲線呢?如我們也還可以用方波或三角波來代替呀,分解信號的方法是無窮多的,但分解信號的目的是為了更加簡單地處理原來的信號。用正餘弦來表示原信號會更加簡單,因為正餘弦擁有原信號所不具有的性質:正弦曲線保真度。一個正餘弦曲線信號輸入後,輸出的仍是正餘弦曲線,只有幅度和相位可能發生變化,但是頻率和波的形狀仍是一樣的。且只有正餘弦曲線才擁有這樣的性質,正因如此我們才不用方波或三角波來表示。

3 Dijkstra 演算法

Dijkstra演算法是典型的演算法。Dijkstra演算法是很有代表性的演算法。Dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用OPEN, CLOSE表的方式,這里均採用永久和臨時標號的方式。注意該演算法要求圖中不存在負權邊。

4 RSA演算法變換

RSA是目前最有影響力的公鑰加密演算法,它能夠抵抗到目前為止已知的絕大多數密碼攻擊,已被ISO推薦為公鑰數據加密標准。今天只有短的RSA鑰匙才可能被強力方式解破。到2008年為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息實際上是不能被解破的。但在分布式計算和量子計算機理論日趨成熟的今天,RSA加密安全性受到了挑戰。

5 安全哈希演算法

一種對輸入信息(例如消息)進行摘要的演算法。摘要過程能夠完成下列特點:不同的輸入信息絕對不會具有相同的指紋:相近輸入信息經過摘要之後的輸出信息具有較大的差異,同時計算上很難生產一個與給定輸入具有相同指紋的輸入。(即不可逆)。

6 整數因式分解

這是在計算機領域被大量使用的數學演算法,沒有這個演算法,信息加密會更不安全。該演算法定義了一系列步驟,得到將一合數分解為更小因子的質數分解式。這被認為是一種FNP問題,它是NP分類問題的延伸,極其難以解決。許多加密協議(如RSA演算法)都基於這樣一個原理:對大的合數作因式分解是非常困難的。如果一個演算法能夠快速地對任意整數進行因式分解,RSA的公鑰加密體系就會失去其安全性。量子計算的誕生使我們能夠更容易地解決這類問題,同時它也打開了一個全新的領域,使得我們能夠利用量子世界中的特性來保證系統安全。

7 鏈接分析

鏈接分析,源於對Web結構中超鏈接的多維分析。當前其應用主要體現在網路信息檢索、網路計量學、數據挖掘、Web結構建模等方山。作為Google的核心技術之一,鏈接分析演算法應用已經顯現出j驚人的商業價值。

8 比例積分微分演算法

你是否曾經用過飛機、汽車、衛星服務或手機網路?你是否曾經在工廠工作或是看見過機器人?如果回答是肯定的,那麼你應該已經見識過這個演算法了。大體上,這個演算法使用一種控制迴路反饋機制,將期望輸出信號和實際輸出信號之間的錯誤最小化。無論何處,只要你需要進行信號處理,或者你需要一套電子系統,用來自動化控制機械、液壓或熱力系統,這個演算法都會有用武之地。可以這樣說,如果沒有這個演算法,現代文明將不復存在。

9 數據壓縮演算法

在現今的電子信息技術領域,正發生著一場有長遠影響的數字化革命。由於數字化的多媒體信息尤其是數字視頻、音頻信號的數據量特別龐大,如果不對其進行有效的壓縮就難以得到實際的應用。因此,數據壓縮技術已成為當今數字通信、廣播、存儲和多媒體娛樂中的一項關鍵的共性技術。

10 隨機數生成

在統計學的不同技術中需要使用隨機數,比如在從統計總體中抽取有代表性的樣本的時候,或者在將實驗動物分配到不同的試驗組的過程中,或者在進行蒙特卡羅模擬法計算的時候等等。

⑶ 常見的排序演算法—選擇,冒泡,插入,快速,歸並

太久沒看代碼了,最近打算復習一下java,又突然想到了排序演算法,就把幾種常見的排序演算法用java敲了一遍,這里統一將無序的序列從小到大排列。

選擇排序是一種簡單直觀的排序演算法。它的工作原理是:第一次從待排序的數據元素中選出最小的一個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小元素,繼續放在下一個位置,直到待排序元素個數為0。

選擇排序代碼如下:

public void Select_sort(int[] arr) {

int temp,index;

for( int i=0;i<10;i++) {

index = i;

for(int j = i + 1 ; j < 10 ; j++) {

if(arr[j] < arr[index])

index = j;

}

/*

temp = arr[i];

arr[i] = arr[index];

arr[index] = temp;

*/

swap(arr,i,index);

}

System.out.print("經過選擇排序後:");

for(int i = 0 ; i < 10 ; i++)

System.out.print( arr[i] +" ");

System.out.println("");

}

冒泡排序是一種比較基礎的排序演算法,其思想是相鄰的元素兩兩比較,較大的元素放後面,較小的元素放前面,這樣一次循環下來,最大元素就會歸位,若數組中元素個數為n,則經過(n-1)次後,所有元素就依次從小到大排好序了。整個過程如同氣泡冒起,因此被稱作冒泡排序。

選擇排序代碼如下:

public void Bubble_sort(int[] arr) {

int temp;

for(int i = 0 ; i < 9 ; i++) {

for(int j = 0 ; j < 10 - i - 1 ;j++) {

if(arr[j] > arr[j+1]) {

/*

temp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = temp;

*/

swap(arr,j,j+1);

}

}

}

System.out.print("經過冒泡排序後:");

for(int i = 0 ; i < 10 ; i++)

System.out.print( arr[i] +" ");

System.out.println("");

}

插入排序也是一種常見的排序演算法,插入排序的思想是:創建一個與待排序數組等大的數組,每次取出一個待排序數組中的元素,然後將其插入到新數組中合適的位置,使新數組中的元素保持從小到大的順序。

插入排序代碼如下:

public void Insert_sort(int[] arr) {

int length = arr.length;

int[] arr_sort = new int[length];

int count = 0;

for(int i = 0;i < length; i++) {

if(count == 0) {

arr_sort[0] = arr[0];

}else if(arr[i] >= arr_sort[count - 1]) {

arr_sort[count] = arr[i];

}else if(arr[i] < arr_sort[0]) {

insert(arr,arr_sort,arr[i],0,count);

}else {

for(int j = 0;j < count - 1; j++) {

if(arr[i] >= arr_sort[j] && arr[i] < arr_sort[j+1]) {

insert(arr,arr_sort,arr[i],j+1,count);

break;

}

}

}

count++;

}

System.out.print("經過插入排序後:");

for(int i = 0 ; i < 10 ; i++)

System.out.print( arr_sort[i] +" ");

System.out.println("");

}

public void insert(int[] arr,int[] arr_sort,int value,int index,int count) {

for(int i = count; i > index; i--)

arr_sort[i] = arr_sort[i-1];

arr_sort[index] = value;

}

快速排序的效率比冒泡排序演算法有大幅提升。因為使用冒泡排序時,一次外循環只能歸位一個值,有n個元素最多就要執行(n-1)次外循環。而使用快速排序時,一次可以將所有元素按大小分成兩堆,也就是平均情況下需要logn輪就可以完成排序。

快速排序的思想是:每趟排序時選出一個基準值(這里以首元素為基準值),然後將所有元素與該基準值比較,並按大小分成左右兩堆,然後遞歸執行該過程,直到所有元素都完成排序。

public void Quick_sort(int[] arr, int left, int right) {

if(left >= right)

return ;


int temp,t;

int j = right;

int i = left;

temp = arr[left];

while(i < j) {

while(arr[j] >= temp && i < j)

j--;

while(arr[i] <= temp && i < j)

i++;

if(i < j) {

t = arr[i];

arr[i] = arr[j];

arr[j] = t;

}

}

arr[left] = arr[i];

arr[i] = temp;


Quick_sort(arr,left, i - 1);

Quick_sort(arr, i + 1, right);

}

歸並排序是建立在歸並操作上的一種有效的排序演算法,歸並排序對序列的元素進行逐層折半分組,然後從最小分組開始比較排序,每兩個小分組合並成一個大的分組,逐層進行,最終所有的元素都是有序的。

public void Mergesort(int[] arr,int left,int right) {

if(right - left > 0) {

int[] arr_1 = new int[(right - left)/2 + 1];

int[] arr_2 = new int[(right - left + 1)/2];

int j = 0;

int k = 0;

for(int i = left;i <= right;i++) {

if(i <= (right + left)/2) {

arr_1[j++] = arr[i];

}else {

arr_2[k++] = arr[i];

}

}

Mergesort(arr_1,0,(right - left)/2);

Mergesort(arr_2,0,(right - left - 1)/2);

Merge(arr_1,arr_2,arr);

}

}

public void Merge(int[] arr_1,int[] arr_2,int[] arr) {

int i = 0;

int j = 0;

int k = 0;

int L1 = arr_1.length;

int L2 = arr_2.length;

while(i < L1 && j < L2) {

if(arr_1[i] <= arr_2[j]) {

arr[k] = arr_1[i];

i++;

}else {

arr[k] = arr_2[j];

j++;

}

k++;

}

if(i == L1) {

for(int t = j;j < L2;j++)

arr[k++] = arr_2[j];

}else {

for(int t = i;i < L1;i++)

arr[k++] = arr_1[i];

}

}

歸並排序這里我使用了left,right等變數,使其可以通用,並沒有直接用數字表示那麼明確,所以給出相關偽代碼,便於理解。

Mergesort(arr[0...n-1])

//輸入:一個可排序數組arr[0...n-1]

//輸出:非降序排列的數組arr[0...n-1]

if n>1

arr[0...n/2-1] to arr_1[0...(n+1)/2-1]//確保arr_1中元素個數>=arr_2中元素個數

//對於總個數為奇數時,arr_1比arr_2中元素多一個;對於總個數為偶數時,沒有影響

arr[n/2...n-1] to arr_2[0...n/2-1]

Mergesort(arr_1[0...(n+1)/2-1])

Mergesort(arr_2[0...n/2-1])

Merge(arr_1,arr_2,arr)

Merge(arr_1[0...p-1],arr_2[0...q-1],arr[0...p+q-1])

//輸入:兩個有序數組arr_1[0...p-1]和arr_2[0...q-1]

//輸出:將arr_1與arr_2兩數組合並到arr

int i<-0;j<-0;k<-0

while i

<p span="" do<="" j

if arr_1[i] <= arr_2[j]

arr[k] <- arr_1[i]

i<-i+1

else arr[k] <- arr_2[j];j<-j+1

k<-k+1

if i=p

arr_2[j...q-1] to arr[k...p+q-1]

else arr_1[i...p-1] to arr[k...p+q-1]

package test_1;

import java.util.Scanner;

public class Test01 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int[] arr_1 = new int[10];

for(int i = 0 ; i < 10 ; i++)

arr_1[i] = sc.nextInt();

Sort demo_1 = new Sort();


//1~5一次只能運行一個,若多個同時運行,則只有第一個有效,後面幾個是無效排序。因為第一個運行的已經將帶排序數組排好序。


demo_1.Select_sort(arr_1);//-----------------------1


//demo_1.Bubble_sort(arr_1);//---------------------2


/* //---------------------3

demo_1.Quick_sort(arr_1, 0 , arr_1.length - 1);

System.out.print("經過快速排序後:");

for(int i = 0 ; i < 10 ; i++)

System.out.print( arr_1[i] +" ");

System.out.println("");

*/


//demo_1.Insert_sort(arr_1);//--------------------4


/* //--------------------5

demo_1.Mergesort(arr_1,0,arr_1.length - 1);

System.out.print("經過歸並排序後:");

for(int i = 0 ; i < 10 ; i++)

System.out.print( arr_1[i] +" ");

System.out.println("");

*/

}

}

class Sort {

public void swap(int arr[],int a, int b) {

int t;

t = arr[a];

arr[a] = arr[b];

arr[b] = t;

}


public void Select_sort(int[] arr) {

int temp,index;

for( int i=0;i<10;i++) {

index = i;

for(int j = i + 1 ; j < 10 ; j++) {

if(arr[j] < arr[index])

index = j;

}

/*

temp = arr[i];

arr[i] = arr[index];

arr[index] = temp;

*/

swap(arr,i,index);

}

System.out.print("經過選擇排序後:");

for(int i = 0 ; i < 10 ; i++)

System.out.print( arr[i] +" ");

System.out.println("");

}


public void Bubble_sort(int[] arr) {

int temp;

for(int i = 0 ; i < 9 ; i++) {

for(int j = 0 ; j < 10 - i - 1 ;j++) {

if(arr[j] > arr[j+1]) {

/*

temp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = temp;

*/

swap(arr,j,j+1);

}

}

}

System.out.print("經過冒泡排序後:");

for(int i = 0 ; i < 10 ; i++)

System.out.print( arr[i] +" ");

System.out.println("");

}


public void Quick_sort(int[] arr, int left, int right) {

if(left >= right)

return ;


int temp,t;

int j = right;

int i = left;

temp = arr[left];

while(i < j) {

while(arr[j] >= temp && i < j)

j--;

while(arr[i] <= temp && i < j)

i++;

if(i < j) {

t = arr[i];

arr[i] = arr[j];

arr[j] = t;

}

}

arr[left] = arr[i];

arr[i] = temp;


Quick_sort(arr,left, i - 1);

Quick_sort(arr, i + 1, right);

}


public void Insert_sort(int[] arr) {

int length = arr.length;

int[] arr_sort = new int[length];

int count = 0;

for(int i = 0;i < length; i++) {

if(count == 0) {

arr_sort[0] = arr[0];

}else if(arr[i] >= arr_sort[count - 1]) {

arr_sort[count] = arr[i];

}else if(arr[i] < arr_sort[0]) {

insert(arr,arr_sort,arr[i],0,count);

}else {

for(int j = 0;j < count - 1; j++) {

if(arr[i] >= arr_sort[j] && arr[i] < arr_sort[j+1]) {

insert(arr,arr_sort,arr[i],j+1,count);

break;

}

}

}

count++;

}

System.out.print("經過插入排序後:");

for(int i = 0 ; i < 10 ; i++)

System.out.print( arr_sort[i] +" ");

System.out.println("");

}

public void insert(int[] arr,int[] arr_sort,int value,int index,int count) {

for(int i = count; i > index; i--)

arr_sort[i] = arr_sort[i-1];

arr_sort[index] = value;

}


public void Mergesort(int[] arr,int left,int right) {

if(right - left > 0) {

int[] arr_1 = new int[(right - left)/2 + 1];

int[] arr_2 = new int[(right - left + 1)/2];

int j = 0;

int k = 0;

for(int i = left;i <= right;i++) {

if(i <= (right + left)/2) {

arr_1[j++] = arr[i];

}else {

arr_2[k++] = arr[i];

}

}

Mergesort(arr_1,0,(right - left)/2);

Mergesort(arr_2,0,(right - left - 1)/2);

Merge(arr_1,arr_2,arr);

}

}

public void Merge(int[] arr_1,int[] arr_2,int[] arr) {

int i = 0;

int j = 0;

int k = 0;

int L1 = arr_1.length;

int L2 = arr_2.length;

while(i < L1 && j < L2) {

if(arr_1[i] <= arr_2[j]) {

arr[k] = arr_1[i];

i++;

}else {

arr[k] = arr_2[j];

j++;

}

k++;

}

if(i == L1) {

for(int t = j;j < L2;j++)

arr[k++] = arr_2[j];

}else {

for(int t = i;i < L1;i++)

arr[k++] = arr_1[i];

}

}

}

若有錯誤,麻煩指正,不勝感激。

⑷ 加密方式有幾種

加密方式的種類:

1、MD5

一種被廣泛使用的密碼散列函數,可以產生出一個128位(16位元組)的散列值(hash value),用於確保信息傳輸完整一致。MD5由美國密碼學家羅納德·李維斯特(Ronald Linn Rivest)設計,於1992年公開,用以取代MD4演算法。這套演算法的程序在 RFC 1321 標准中被加以規范。

2、對稱加密

對稱加密採用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱為對稱加密,也稱為單密鑰加密。

3、非對稱加密

與對稱加密演算法不同,非對稱加密演算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密。

如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種演算法叫作非對稱加密演算法。

(4)選擇排序實現加密擴展閱讀

非對稱加密工作過程

1、乙方生成一對密鑰(公鑰和私鑰)並將公鑰向其它方公開。

2、得到該公鑰的甲方使用該密鑰對機密信息進行加密後再發送給乙方。

3、乙方再用自己保存的另一把專用密鑰(私鑰)對加密後的信息進行解密。乙方只能用其專用密鑰(私鑰)解密由對應的公鑰加密後的信息。

在傳輸過程中,即使攻擊者截獲了傳輸的密文,並得到了乙的公鑰,也無法破解密文,因為只有乙的私鑰才能解密密文。

同樣,如果乙要回復加密信息給甲,那麼需要甲先公布甲的公鑰給乙用於加密,甲自己保存甲的私鑰用於解密。

⑸ iOS開發面試拿offer攻略之數據結構與演算法篇附加安全加密

集合結構 線性結構 樹形結構 圖形結構

1.1、集合結構 說白了就是一個集合,就是一個圓圈中有很多個元素,元素與元素之間沒有任何關系 這個很簡單

1.2、線性結構 說白了就是一個條線上站著很多個人。 這條線不一定是直的。也可以是彎的。也可以是值的 相當於一條線被分成了好幾段的樣子 (發揮你的想像力)。 線性結構是一對一的關系

1.3、樹形結構 說白了 做開發的肯定或多或少的知道 xml 解析 樹形結構跟他非常類似。也可以想像成一個金字塔。樹形結構是一對多的關系

1.4、圖形結構 這個就比較復雜了。他呢 無窮。無邊 無向(沒有方向)圖形機構 你可以理解為多對多 類似於我們人的交集關系

數據結構的存儲

數據結構的存儲一般常用的有兩種 順序存儲結構 和 鏈式存儲結構

2.1 順序存儲結構

發揮想像力啊。 舉個列子。數組。1-2-3-4-5-6-7-8-9-10。這個就是一個順序存儲結構 ,存儲是按順序的 舉例說明啊。 棧,做開發的都熟悉。棧是先進後出 ,後進先出的形式 對不對 ?

他的你可以這樣理解, hello world 在棧裡面從棧底到棧頂的邏輯依次為 h-e-l-l-o-w-o-r-l-d 這就是順序存儲,再比如隊列 ,隊列是先進先出的對吧,從頭到尾 h-e-l-l-o-w-o-r-l-d 就是這樣排對的

2.2 鏈式存儲結構

再次發揮想像力 這個稍微復雜一點 這個圖片我一直弄好 ,回頭找美工問問,再貼上 例如 還是一個數組 1-2-3-4-5-6-7-8-9-10 鏈式存儲就不一樣了 1(地址)-2(地址)-7(地址)-4(地址)-5(地址)-9(地址)-8(地址)-3(地址)-6(地址)-10(地址)。每個數字後面跟著一個地址 而且存儲形式不再是順序 ,也就說順序亂了,1(地址) 1 後面跟著的這個地址指向的是 2,2 後面的地址指向的是 3,3 後面的地址指向是誰你應該清楚了吧。他執行的時候是 1(地址)-2(地址)-3(地址)-4(地址)-5(地址)-6(地址)-7(地址)-8(地址)-9(地址)-10(地址),但是存儲的時候就是完全隨機的。明白了?

單向鏈表雙向鏈表循環鏈表

還是舉例子。理解最重要。不要去死記硬背 哪些什麼。定義啊。邏輯啊。理解才是最重要滴

3.1 單向鏈表

A->B->C->D->E->F->G->H . 這就是單向鏈表 H 是頭 A 是尾 像一個只有一個頭的火車一樣 只能一個頭拉著跑

3.2 雙向鏈表

數組和鏈表區別:

數組:數組元素在內存上連續存放,可以通過下標查找元素;插入、刪除需要移動大量元素,比較適用元素很少變化的情況

鏈表:鏈表中的元素在內存中不是順序存儲的,查找慢,插入、刪除只需要對元素指針重新賦值,效率高

3.3 循環鏈表

循環鏈表是與單向鏈表一樣,是一種鏈式的存儲結構,所不同的是,循環鏈表的最後一個結點的指針是指向該循環鏈表的第一個結點或者表頭結點,從而構成一個環形的鏈。發揮想像力 A->B->C->D->E->F->G->H->A . 繞成一個圈。就像蛇吃自己的這就是循環 不需要去死記硬背哪些理論知識。

二叉樹/平衡二叉樹

4.1 什麼是二叉樹

樹形結構下,兩個節點以內 都稱之為二叉樹 不存在大於 2 的節點 分為左子樹 右子樹 有順序 不能顛倒 ,懵逼了吧,你肯定會想這是什麼玩意,什麼左子樹右子樹 ,都什麼跟什麼鬼? 現在我以普通話再講一遍,你把二叉樹看成一個人 ,人的頭呢就是樹的根 ,左子樹就是左手,右子樹就是右手,左右手可以都沒有(殘疾嘛,聲明一下,絕非歧視殘疾朋友,勿怪,勿怪就是舉個例子, I am very sorry ) , 左右手呢可以有一個,就是不能顛倒。這樣講應該明白了吧

二叉樹有五種表現形式

1.空的樹(沒有節點)可以理解為什麼都沒 像空氣一樣

2.只有根節點。 (理解一個人只有一個頭 其他的什麼都沒,說的有點恐怖)

3.只有左子樹 (一個頭 一個左手 感覺越來越寫不下去了)

4.只有右子樹

5.左右子樹都有

二叉樹可以轉換成森林 樹也可以轉換成二叉樹。這里就不介紹了 你做項目絕對用不到數據結構大致介紹這么多吧。理解為主, 別死記,死記沒什麼用

1、不用中間變數,用兩種方法交換 A 和 B 的值

2、****求最大公約數

3、模擬棧操作

棧是一種數據結構,特點:先進後出 -

練習:使用全局變數模擬棧的操作

#include <stdio.h>

#include <stdbool.h>

#include <assert.h>

//保護全局變數:在全局變數前加 static 後,這個全局變數就只能在本文件中使用 static int data[1024] ;//棧最多能保存 1024 個數據

static int count = 0 ;//目前已經放了多少個數(相當於棧頂位置)

4、排序演算法

選擇排序、冒泡排序、插入排序三種排序演算法可以總結為如下:

都將數組分為已排序部分和未排序部分。

1.選擇排序將已排序部分定義在左端,然後選擇未排序部分的最小元素和未排序部分的第一個元素交換。

2.冒泡排序將已排序部分定義在右端,在遍歷未排序部分的過程執行交換,將最大元素交換到最右端。

3.插入排序將已排序部分定義在左端,將未排序部分元的第一個元素插入到已排序部分合適的位置。

4.1、選擇排序

【選擇排序】:最值出現在起始端

第 1 趟:在 n 個數中找到最小(大)數與第一個數交換位置

第 2 趟:在剩下 n-1 個數中找到最小(大)數與第二個數交換位置

重復這樣的操作...依次與第三個、第四個...數交換位置

第 n-1 趟,最終可實現數據的升序(降序)排列。

4.2、冒泡排序

【冒泡排序】:相鄰元素兩兩比較,比較完一趟,最值出現在末尾

第 1 趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放後)逐個推進,最值最後出現在第 n 個元素位置

第 2 趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放後)逐個推進,最值最後出現在第 n-1 個元素位置

…… ……

第 n-1 趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放後)逐個推進,最值最後出現在第 2 個元素位置

5、折半查找(二分查找)

折半查找:優化查找時間(不用遍歷全部數據) 折半查找的原理:

1.數組必須是有序的

2.必須已知 min 和 max (知道範圍)

// 已知一個有序數組, 和一個 key , 要求從數組中找到 key 對應的索引位置

字元串反轉

給定字元串 " hello,world ",實現將其反轉。輸出結果: dlrow , olleh

序數組合並

將有序數組 {1,4,6,7,9} 和 {2,3,5,6,8,9,10,11,12} 合並為{1,2,3,4,5,6,6,7,8,9,9,10,11,12}

HASH 演算法

哈希表

例:給定值是字母 a ,對應 ASCII 碼值是 97,數組索引下標為 97。

這里的 ASCII 碼,就算是一種哈希函數,存儲和查找都通過該函數,有效地提高查找效率。

在一個字元串中找到第一個只出現一次的字元。如輸入" abaccdeff ",輸出' b '字元( char )是一個長度為 8 的數據類型,因此總共有 256 種可能。每個字母根據其 ASCII 碼值作為數組下標對應數組種的一個數字。數組中存儲的是每個字元出現的次數。

查找兩個子視圖的共同父視圖

思路:分別記錄兩個子視圖的所有父視圖並保存到數組中,然後倒序尋找,直至找到第一個不一樣的父視圖。

求無序數組中的中位數

中位數:當數組個數 n 為奇數時,為 (n + 1)/2 ,即是最中間那個數字;當 n 為偶數時,為 (n/2 + (n/2 + 1))/2 , 即是中間兩個數字的平均數。

首先要先去了解一些幾種排序演算法: iOS 排序演算法

思路:

1.排序演算法+中位數

首先用冒泡排序、快速排序、堆排序、希爾排序等排序演算法將所給數組排序,然後取出其中位數即可。

2.利用快排思想

1、簡述 SSL 加密的過程用了哪些加密方法,為何這么作?

SSL 加密的過程之前有些過,此處不再贅述。

SSL 加密,在過程中實際使用了 對稱加密 和 非對稱加密 的結合。

主要的考慮是先使用 非對稱加密 進行連接,這樣做是為了避免中間人攻擊秘鑰被劫持,但是 非對稱加密的效率比較低。所以一旦建立了安全的連接之後,就可以使用輕量的 對稱加密。

2、RSA 非對稱加密

對稱加密[演算法]在加密和解密時使用的是同一個秘鑰;而[非對稱加密演算法]需要兩個[密鑰]來進行加密和解密,這兩個秘鑰是[公開密鑰]( public key ,簡稱公鑰)和私有密鑰( private key ,簡稱私鑰)。

RSA 加密

與對稱加密[演算法]不同,[非對稱加密演算法]需要兩個[密鑰]:[公開密鑰]( publickey )和私有密鑰( privatekey )。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因為加密和解密使用的是兩個不同的[密鑰],所以這種演算法叫作[非對稱加密演算法]。

RSA**** 加密原理

RSA 是常用的加密模式,其加密原理可用以下的例子進行簡要的論述。

隨機取兩個質數

以上就是本篇所整理的,感謝觀看!

閱讀全文

與選擇排序實現加密相關的資料

熱點內容
網路加密伺服器有什麼作用 瀏覽:260
蘋果手機pdf怎麼保存 瀏覽:982
編譯器語法大嗎 瀏覽:27
隱私加密的分類 瀏覽:23
endnote文件直接放入文件夾 瀏覽:743
androidcamera幀率 瀏覽:65
飢荒官方伺服器怎麼初始化 瀏覽:579
蠟筆小新媽媽壓縮棉被子 瀏覽:603
pdf單頁保存 瀏覽:938
拼車小程序源碼gitlab 瀏覽:575
華為機器控制演算法專業碩士工薪 瀏覽:84
程序員游戲出包 瀏覽:29
天雲游app怎麼下載 瀏覽:262
utf8不可映射字元無法編譯 瀏覽:505
visualc編程pdf 瀏覽:650
加密獨角獸企業 瀏覽:809
天翼雲盤怎麼保存app 瀏覽:988
如何給磁碟進行加密 瀏覽:655
方舟手游如何收藏伺服器 瀏覽:520
如何自己組裝伺服器 瀏覽:96