八大排序超詳解(動圖+源碼)

💓博主個人主頁:不是笨小孩👀
?專欄分類:數據結構與算法👀 刷題專欄👀 C語言👀
🚚代碼倉庫:笨小孩的代碼庫👀
?社區:不是笨小孩👀
🌹歡迎大家三連關注,一起學習,一起進步!!💓

在這里插入圖片描述

排序算法

  • 排序的概念
  • 插入排序
  • 希爾排序
  • 選擇排序
  • 冒泡排序
  • 堆排序
  • 快速排序
  • 歸并排序
  • 計數排序

排序的概念

排序:所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。
穩定性:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次 序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,則稱這種排 序算法是穩定的;否則稱為不穩定的。
內部排序:數據元素全部放在內存中的排序。
外部排序:數據元素太多不能同時放在內存中,根據排序過程的要求不能在內外存之間移動數據的排序。

常見的排序算法:

在這里插入圖片描述
除了這些排序以外,該有一個很奇怪的排序,計數排序,我們待會將,我們接下來,就從第一個排序開始:

插入排序

插入排序的思想很簡單就是把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的記錄插入完為止,得到一個新的有序序列 。插入排序可以理解為就是我們打撲克牌摸排的過程,摸一張排,依次比較然后將它插入的合適的位置。

我們看圖:
在這里插入圖片描述
這個排序很簡單,根據圖我們就可以把第一個數據當成有序的數據,然后后面的數據依次插入,直到將數據插入完,這樣就有序了。

代碼如下:

void InsertSort(int* arr, int n)
{for (int i = 0; i < n-1; i++){//end表示有序數據的最后一數的下標int end = i;//tmp保存需要插入的值int tmp = arr[end+1]; while (end >= 0){//依次比較如果比需要插入的數大,就往后移,否則就跳出循環if (arr[end] > tmp){arr[end + 1] = arr[end];end--;}else{break;}}//跳出循環后將需要插入的數據放到end后面的位置arr[end + 1] = tmp;}
}

總結:

  1. 元素集合越接近有序,直接插入排序算法的時間效率越高
  2. 時間復雜度:O(N^2)
  3. 空間復雜度:O(1),它是一種穩定的排序算法
  4. 穩定性:穩定

希爾排序

希爾排序法又稱縮小增量法。希爾排序法的基本思想是:先選定一個整數gap,把待排序文件中所有記錄分成gap個組,所有距離為gap的記錄分在同一組內,并對每一組內的記錄進行排序。然后,重復上述分組和排序的工作。當到達=1時,所有記錄在統一組內排好序。

插入排序第一步我們需要預排序
預排序后插入排序就很快了,直接使用插入排序就可以了。但是當我們的gap=1是,希爾排序就相當于插入排序了。這里gap可以取很多值,但是要保證最后一次gap=1.

在這里插入圖片描述

代碼如下:

void ShellSort(int* arr, int n)
{int gap = n;//要進行多趟排序while (gap > 1){//+1是為了保證gap最后一次等于1gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++){//每次分別排gap組數據,每組間隔gap個數據,一共gap組int end = i;int tmp = arr[i + gap];while (end >= 0){if (arr[end] > tmp){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = tmp;}}
}

總結:

  1. 希爾排序是對直接插入排序的優化。
  2. 當gap > 1時都是預排序,目的是讓數組更接近于有序。當gap == 1時,數組已經接近有序的了,這樣就 會很快。這樣整體而言,可以達到優化的效果。我們實現后可以進行性能測試的對比。
  3. 希爾排序的時間復雜度不好計算,因為gap的取值方法很多,導致很難去計算,因此在好些樹中給出的 希爾排序的時間復雜度都不固定:我們記住大約就等于O(N^1.3)
  4. 穩定性:不穩定

選擇排序

選擇排序是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完 。

在這里插入圖片描述

我們這里實現的是依次找大的,然后放到最后面,和圖不太一樣,但是思想都一樣。

代碼如下:

void SelectSort(int* arr, int n)
{int end = n - 1;while (end>0){//每次初始化最大在0處,防止maxi到已經在排好序的位置int maxi = 0;for (int i = 0; i <= end; i++){if (arr[i] > arr[maxi]){maxi = i;}}//找到后和最后一個數據交換Swap(&arr[maxi], &arr[end]);end--;}
}

選擇排序我們這里可以優化一下,就是每次選出最小的和最大的,然后最小的放到左邊,最大的放到右邊,然后接著找剩余數據的最大最小,直到結束。

代碼如下:

void SelectSort(int* arr, int n)
{int begin = 0;int end = n - 1;while (begin < end){int maxi = begin;int mini = begin;//依次找大和找小for (int i = begin; i <= end; i++){if (arr[mini] > arr[i]){mini = i;}if (arr[maxi] < arr[i]){maxi = i;}}//找到后將大的數據放到后面Swap(&arr[maxi], &arr[end]);//防止最小的數據在最后面被換走了,及時修正if (mini == end){mini = maxi;}Swap(&arr[mini], &arr[begin]);begin++;end--;}
}

總結:

  1. 直接選擇排序思考非常好理解,但是效率不是很好。實際中很少使用
  2. 時間復雜度:O(N^2)
  3. 空間復雜度:O(1)
  4. 穩定性:不穩定

冒泡排序

冒泡排序大多數人應該都知道,它的基本思想就是依次比較,將大的數據冒到最后然后重復前面的過程,就可以完成排序。

在這里插入圖片描述
代碼如下:

void BubbleSort(int* arr, int n)
{for (int i = 0; i < n - 1; i++){int flag = 1;for (int j = 1; j < n - i; j++){if (arr[j] < arr[j - 1]){Swap(arr + j, arr + j - 1);flag = 0;}}if (flag == 1){break;}}
}

總結:

  1. 冒泡排序是一種非常容易理解的排序
  2. 時間復雜度:O(N^2)
  3. 空間復雜度:O(1)
  4. 穩定性:穩定

堆排序

堆排序前面已經講過一次了,這里就不做過多的解釋了,想要詳細了解請戳。
這里是引用

總結:

  1. 堆排序使用堆來選數,效率就高了很多。
  2. 時間復雜度:O(N*logN)
  3. 空間復雜度:O(1)
  4. 穩定性:不穩定

快速排序

快速排序是Hoare于1962年提出的一種二叉樹結構的交換排序方法,其基本思想為:任取待排序元素序列中
的某元素作為基準值,按照該排序碼將待排序集合分割成兩子序列,左子序列中所有元素均小于基準值,右
子序列中所有元素均大于基準值,然后最左右子序列重復該過程,直到所有元素都排列在相應位置上為止。

我們每次可以將數組劃分為兩部分,keyi是那個選出來的數的最終的下標,然后第一次排序后就是[left,keyi-1],keyi,[keyi+1,right],我們每一趟要保證的是keyi左邊的數據逗比key小,右邊的都比它大,然后左區間重復這個操作,右區間也重復這個操作,這就有點像二叉樹的前序遍歷,直到每個區間只剩下一個值,或者區間不存在時,我們結束遞歸。

快排的整體框架:

void QuickSort(int* arr, int left, int right)
{if (left >= right){return;}int keyi = partSort(arr,left,right);QuickSort(arr,left, keyi - 1);QuickSort(arr,keyi + 1, right);}

這里的partSort就是我們的單趟排序,我們講三種方法:

  1. hoare版本
    在這里插入圖片描述

我們需要兩個指針,一個從左邊開始走,一個從右邊開始走,再定義一個key,和keyi,keyi保存key的小標,如果左邊左key就右邊先走,右邊左key就左邊先走,,然后左邊找比key大的數,右邊找比key小的數,找到后交換,然后接著走,直到相遇,然后把相遇的位置和key交換一下。

為什么左邊做key右邊先走呢?

因為這樣可以保證相遇的位置一定是比key小等于的數,相遇無非就是兩種情況,L遇到R,R遇到L,如果是L遇到R,我們讓右邊先走,R停下的位置一定是比key小的數,如果是R遇L,假設數組中的數都比key大,所以key遇到L是就是等于key,所以我們左邊做key讓右邊先走,是可以保證相遇位置一定比key小的。

代碼如下:

int partSort1(int* arr, int left, int right)
{int keyi = left;while (left < right){//右邊找小while (left < right && arr[right] >= arr[keyi]){right--;}//左邊找大while (left < right && arr[left] <= arr[keyi]){left++;}Swap(&arr[left], &arr[right]);}Swap(&arr[left], &arr[keyi]);return left;
}
  1. 挖坑法
    在這里插入圖片描述

我們還是將左邊做key,然后保存它的值,然后它就是一個坑,還是兩個指針,由于左邊有一個坑,所以右邊就要找小的數來填這個坑,然后將右邊的那個位置變成新的坑,然后左邊找大,找到后接著填坑,更新坑的位置,L和R一定有一個是坑,所以,當他們相遇時,那個位置一定是坑,然后將key放進去即可。

代碼如下:

int partSort2(int* arr, int left, int right)
{int hole = arr[left];int keyi = left;while (left < right){while (left < right && arr[right] >= hole){right--;}arr[keyi] = arr[right];keyi = right;while (left < right && arr[left] <= hole){left++;}arr[keyi] = arr[left];keyi = left;}arr[keyi] = hole;return keyi;
}
  1. 前后指針法
    在這里插入圖片描述

定義兩個指針一個prev一個cur,cur用來遍歷數組,還是用左邊的值來做key,然后將cur找到比key小的值就和++prev位置的數交換直到遍歷結束,然后再把prev位置的值可key交換即可。

代碼如下:

int partSort3(int* arr, int left, int right)
{int keyi = left;int cur = left + 1;int prev = left;while (cur <= right){if (arr[cur] < arr[keyi]&&++prev!=cur){Swap(&arr[prev], &arr[cur]);}cur++;}Swap(&arr[prev], &arr[keyi]);return prev;
}

快速排序的非遞歸版本

非遞歸的話,我們用隊列和棧都是可以的,但是想要模仿遞歸的路徑的話我們就要使用棧,我們先把數組的整個區間放到棧里面,然后在進行一趟排序后,我們把排出來的左區間和右區間入棧,由于先走左邊,所以就要先把右邊的區間壓棧,然后依次進行,只要區間存在,我們就壓,只要棧不為空,就代表一直有區間未處理。所以我們就一直重復操作,當然單趟排序的話,用上面的那種方法都可以。

代碼如下:

void QuickSortNonR(int* arr, int left, int right)
{Stack st;StackInit(&st);StackPush(&st,right);StackPush(&st, left);while (!StackEmpty(&st)){int begin = StackTop(&st);StackPop(&st);int end = StackTop(&st);StackPop(&st);int keyi = partSort1(arr, begin, end);if (keyi + 1 < end){StackPush(&st, end);StackPush(&st, keyi + 1);}if (keyi - 1 > begin){StackPush(&st, keyi - 1);StackPush(&st, begin);}}
}

快速排序,還可以優化,他的效率和選的key的關系很大,所以我們有種方法叫做三數取中,左邊的值、右邊的值、中間的值,然都找到這三個數中間的數,把他換到左邊,就可以了。

總結:

  1. 快速排序整體的綜合性能和使用場景都是比較好的,所以才敢叫快速排序
  2. 時間復雜度:O(N*logN)
  3. 空間復雜度:O(logN)
  4. 穩定性:不穩定

歸并排序

歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。

歸并排序需要將區間分為兩部分,然后兩部分都要有序才能歸并,那左右區間又可以分割,以此類推,當區間只有一個數的時候就可以認為有序,這時我們可以走一個類似與二叉樹后序遍歷的思路,我們想歸并左右區間,但是左右區間都無序,我們就遞歸左邊讓左邊有序,在遞歸右邊讓右邊有序,最后再左右歸并,就可以排好了。

在這里插入圖片描述

我們這里就需要一個數組來保存我們歸并的值,我們取兩段區間的值依次比較,拿小的尾插到tmp數組中,等歸并完再拷回原數組,即可。

代碼如下:

void _MergeSort(int* arr, int left, int right,int* tmp)
{if (left >= right){return;}//分割區間int mid = (left + right) / 2;_MergeSort(arr, left, mid, tmp);_MergeSort(arr, mid+1, right, tmp);int begin1 = left, end1 = mid;int begin2 = mid + 1, end2 = right;int k = left;while (begin1 <= end1 && begin2 <= end2){//選小的來尾插if (arr[begin1] <= arr[begin2]){tmp[k++] = arr[begin1++];}else{tmp[k++] = arr[begin2++];}}//不管哪個沒有拷貝完,因為區間是有序地,直接尾插就可以while (begin1 <= end1){tmp[k++] = arr[begin1++];}while (begin2 <= end2){tmp[k++] = arr[begin2++];}//拷貝回原數組memcpy(arr + left, tmp + left, (right - left + 1) * sizeof(int));}
void MergeSort(int* arr, int left, int right)
{int* tmp = (int*)malloc(sizeof(int) * (right - left + 1));//不能在這個函數中遞歸,不然每次都要開辟數組_MergeSort(arr, left, right,  tmp);free(tmp);
}

歸并排序的非遞歸版本

我們會發現歸并排序用隊列和棧都用不了,但是我們可以使用循環來解決它,首先我們需要一個gap來記錄每組歸并的數據有幾個,然后控制區間,來進行歸并。
但是在歸并中,會存在很多的越界問題,比如end1越界了,或者begin1越界了,但是這兩種情況我們都很好處理,等處理到這種錯誤時我們可以看成只剩下一組數據,就可以不用動,放在原數就好,等待下一輪歸,直接break跳出就可以,還有一種情況是end2越界了,這時還有一部分數據需要歸并,那我們就調整end2為n-1就可以了。

在這里插入圖片描述

代碼如下:

void MergeSortNonR(int* arr, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);int gap = 1;//gap表示每組數據的長度while (gap < n){for (int i = 0; i < n; i += 2 * gap){//控制區間int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;int k = i;//越界即使調整或退出if (end1 >= n || begin2 >= n){break;}if (end2 >= n){end2 = n - 1;}while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] <= arr[begin2]){tmp[k++] = arr[begin1++];}else{tmp[k++] = arr[begin2++];}}while (begin1 <= end1){tmp[k++] = arr[begin1++];}while (begin2 <= end2){tmp[k++] = arr[begin2++];}//每次歸并完拷貝會原數組memcpy(arr+i, tmp+i, sizeof(int)*(end2-i+1));}gap *= 2;}free(tmp);
}

總結:

  1. 歸并的缺點在于需要O(N)的空間復雜度,歸并排序的思考更多的是解決在磁盤中的外排序問題。
  2. 時間復雜度:O(N*logN)
  3. 空間復雜度:O(N)
  4. 穩定性:穩定

計數排序

計數排序是非常奇怪的排序,它不需要比較任何數據,他開辟一個和最大值一樣的數組,然后將該數組初始化為0,然后原遍歷數組,將原數組的值對應到我們開辟數組的下標,出現一次我們就++該位置,然后統計每個位置出現的次數,然后在依次拷貝回原數組,就可以了。
但是如果數據很大很集中,我們就沒必要開那么大,會很浪費,我們需要找到最大值和最小值,然后使用相對位置,就可以了,每個數對應到減去最小值的那個小下標,這樣我們數組也不用開的很大。

代碼如下:

void CountSort(int* arr, int n)
{int min = arr[0];int max = arr[0];//找最大值和最小值for (int i = 0; i < n; i++){if (max < arr[i]){max = arr[i];}if (min > arr[i]){min = arr[i];}}//計算區間方便開數組int c =max-min+1;int* nums = (int*)malloc(sizeof(int) * c);memset(nums, 0, c * sizeof(int));//統計for (int i = 0; i < n; i++){nums[arr[i]-min]++;}int k = 0;//拷貝回原數組for (int i = 0; i < c; i++){while (nums[i]--){arr[k++] = i+min;}}free(nums);
}

總結:

  1. 計數排序在數據范圍集中時,效率很高,但是適用范圍及場景有限。
  2. 時間復雜度:O(MAX(N,范圍))
  3. 空間復雜度:O(范圍)
  4. 穩定性:穩定

各大排序的比較:
在這里插入圖片描述
今天的分享就到這里感謝大家的關注和支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39477.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39477.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39477.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

虛幻5中Lumen提供哪些功能以及如何工作的

虛幻引擎 5 中的 Lumen 是一個完全動態的全局照明和反射系統。它可以在虛幻引擎 5 中使用&#xff0c;因此創作者無需自行設置。它是為下一代控制臺和建筑可視化等高端可視化而設計的。那么它提供了哪些功能以及如何工作&#xff1f; 全局照明 當光離開光源時&#xff0c;它會…

負載均衡搭建

LVS-DR部署 [客戶端] node1 192.168.157.148 [lvs] node2 192.168.157.142 [web服務器] node3 192.168.157.145 node4 192.168.157.146&#xff08;1&#xff09;[lvs] yum install -y ipvsadm.x86_64 配置LVS負載均衡服務 &#xff08;1&#xff09;手動添加LVS轉發1&#xff…

系統架構設計專業技能 · 軟件工程之軟件測試與維護(六)【系統架構設計師】

系列文章目錄 系統架構設計專業技能 網絡規劃與設計&#xff08;三&#xff09;【系統架構設計師】 系統架構設計專業技能 系統安全分析與設計&#xff08;四&#xff09;【系統架構設計師】 系統架構設計高級技能 軟件架構設計&#xff08;一&#xff09;【系統架構設計師…

MAVEN利器:一文帶你了解MAVEN以及如何配置

前言&#xff1a; 強大的構建工具——Maven。作為Java生態系統中的重要組成部分&#xff0c;Maven為開發人員提供了一種簡單而高效的方式來構建、管理和發布Java項目。無論是小型項目還是大型企業級應用&#xff0c;Maven都能幫助開發人員輕松處理依賴管理、編譯、測試和部署等…

YOLOV7改進:加入RCS-OSA模塊,提升檢測速度

1.該文章屬于YOLOV5/YOLOV7/YOLOV8改進專欄,包含大量的改進方式,主要以2023年的最新文章和2022年的文章提出改進方式。 2.提供更加詳細的改進方法,如將注意力機制添加到網絡的不同位置,便于做實驗,也可以當做論文的創新點。 2.漲點效果:RCS-OSA模塊更加輕量化,有效提升檢…

Spring Boot業務代碼中使用@Transactional事務失效踩坑點總結

1.概述 接著之前我們對Spring AOP以及基于AOP實現事務控制的上文&#xff0c;今天我們來看看平時在項目業務開發中使用聲明式事務Transactional的失效場景&#xff0c;并分析其失效原因&#xff0c;從而幫助開發人員盡量避免踩坑。 我們知道 Spring 聲明式事務功能提供了極其…

uniapp條件編譯

uniapp條件編譯 uni-app 將已經將可以跨平臺兼容處理的組件及 API 等進行了封裝&#xff0c;但是部分平臺的特性無法跨平臺。 由此&#xff0c;uni-app 提供了條件編譯的方案&#xff0c;來處理不同平臺的特定或差異。 寫法 #ifdef&#xff1a; 僅在某平臺存在#ifndef&#xf…

Kafka 01——Kafka的安裝及簡單入門使用

Kafka 01——Kafka的安裝及簡單入門使用 1. 下載安裝1.1 JDK的安裝1.2 Zookeeper的安裝1.2.1 關于Zookeeper版本的選擇1.2.2 下載、安裝Zookeeper 1.3 kafka的安裝1.3.1 下載1.3.2 解壓1.3.3 修改配置文件 2. 啟動 kafka2.1 Kafka啟動2.2 啟動 kafka 遇到的問題2.2.1 問題12.2.…

Python愛心光波

文章目錄 前言Turtle入門簡單案例入門函數 愛心光波程序設計程序分析 尾聲 前言 七夕要來啦&#xff0c;博主在閑暇之余創作了一個愛心光波&#xff0c;感興趣的小伙伴們快來看看吧&#xff01; Turtle入門 Turtle 是一個簡單而直觀的繪圖工具&#xff0c;它可以幫助你通過簡…

面試筆記:Android 架構崗,一次4小時4面的體驗

作者&#xff1a;橘子樹 此次面試一共4面4小時&#xff0c;中間只有幾分鐘間隔。對持續的面試狀態考驗還是蠻大的。 關于面試的心態&#xff0c;保持悲觀的樂觀主義心態比較好。面前做面試準備時保持悲觀&#xff0c;盡可能的做足準備。面后積極做復盤&#xff0c;樂觀的接受最…

基于MIV的神經網絡變量篩選

1.案例背景 一般神經網絡中所包含的網絡輸人數據是研究者根據專業知識和經驗預先選擇好的,然而在許多實際應用中,由于沒有清晰的理論依據,神經網絡所包含的自變量即網絡輸入特征難以預先確定,如果將一些不重要的自變量也引入神經網絡,會降低模型的精度,因此選擇有意義的自變量特…

ECS服務器安裝docker

? 為了安裝并配置 Docker &#xff0c;你的系統必須滿足下列最低要求&#xff1a; 64 位 Linux 或 Windows 系統 如果使用 Linux &#xff0c;內核版本必須不低于 3.10 能夠使用 sudo 權限的用戶 在你系統 BIOS 上啟用了 VT&#xff08;虛擬化技術&#xff09;支持 on your s…

大數據課程I4——Kafka的零拷貝技術

文章作者郵箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;廣東惠州 ▲ 本章節目的 ? 掌握Kafka的零拷貝技術&#xff1b; ? 了解常規的文件傳輸過程&#xff1b; 一、常規的網絡傳輸原理 表面上一個很簡單的網絡文件輸出的過程&#xff0c;在OS底層&…

【java】設計模式——單例模式

單例模式要點&#xff1a; 一個類只需要一個實例化對象&#xff1b;必須自行創建實例&#xff1b;必須自行向整個系統提供這個實例 實現&#xff1a; 只提供私有構造方法&#xff1b;有一個該類的靜態私有對象&#xff1b;提供一個靜態公有方法用于創建、獲取靜態私有對象&…

iOS_crash文件的獲取及符號化(解析)

文章目錄 1. 使用 symbolicatecrash 解析 .ips 文件&#xff1a;2. 使用 CrashSymbolicator.py 解析 ips 文件3. 使用 atos 解析 crash 文件4. Helps4.1 .ips 文件獲取4.2 .crash 文件獲取4.3 獲取 .dSYM 和 .app 文件4.4 使用 dwarfdump 查詢 uuid 5. Tips6. 總結 1. 使用 sym…

一百五十七、Kettle——Kettle最新的官網下載地址(之前的Kettle官網已經無法下載,真坑)

一、目的 之前使用的是kettle8.2&#xff0c;不需要額外下載pentaho-hadoop-shims-hdp30-8.2.2018.11.00-342.jar&#xff0c;因為kettle8.2本身自帶 但是kettle8.2在Linux上安裝后建立共享資源庫又有問題&#xff0c;沒辦法&#xff0c;只能換成kettle9.3 結果&#xff0c;k…

華為網絡篇 RIPv2的基礎配置-25

難度 1復雜度1 目錄 一、實驗原理 1.1 RIP的版本 1.2 RIP的路由更新方式 1.3 RIP的計時器 1.4 RIP的防環機制 二、實驗拓撲 三、實驗步驟 四、實驗過程 總結 一、實驗原理 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息協議&#xff09;&am…

微服務概述-7

Shiro 框架 Shiro 是一個用于 Java 應用程序的安全框架。它提供了身份驗證、授權、加密和會話管理等功能&#xff0c;可以幫助開發人員構建安全可靠的應用程序。 Java 中針對權限管理常見的有 2 個著名的框架&#xff1a;spring security 和 shiro shiro 基本概念 credentia…

機器學習筆記 - 基于C++的??深度學習 二、實現卷積運算

一、卷積 卷積是信號處理領域的老朋友。最初的定義如下 在機器學習術語中: I(…)通常稱為輸入 K(…)作為內核,并且 F(…)作為給定K的I(x)的特征圖。 慮多維離散域,我們可以將積分轉換為以下求和 對于二維數字圖像,我們可以將其重寫為: <

編程練習(1)

目錄 一.選擇題 第一題&#xff1a; 第二題&#xff1a; 第三題&#xff1a; 第四題&#xff1a; 第五題&#xff1a; ?編輯 二.編程題 第一題&#xff1a; 第二題&#xff1a; 1.暴力方法&#xff1a; 2.數組法&#xff1a; 一.選擇題 第一題&#xff1a; 解析&…