集合結構 線性結構 樹形結構 圖形結構
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 是常用的加密模式,其加密原理可用以下的例子進行簡要的論述。
隨機取兩個質數
以上就是本篇所整理的,感謝觀看!