【1.排序】

排序 筆記記錄

  • 1.排序的基本概念
    • 1.1 排序的定義
  • 2. 插入排序
    • 2.1 直接插入排序
    • 2.2 折半插入排序
    • 2.3 希爾排序
  • 3. 交換排序
    • 3.1 冒泡排序
    • 3.2 快速排序
  • 4. 選擇排序
    • 4.1 簡單選擇排序
    • 4.2 堆排序
  • 5. 歸并排序、基數排序和計數排序
    • 5.1 歸并排序
    • 4.2 基數排序
    • 4.3 計數排序
  • 6. 各種內部排序算法的比較及應用
  • 7. 外部排序
  • 8. 一些常見結論

這里是引用

1.排序的基本概念

1.1 排序的定義

  • 排序,就是重新排列表中的元素,使表中的元素滿足按關鍵字有序的過程。為了查找方便, 通常希望計算機中的表是按關鍵字有序的。
  • 穩定性:排列后元素的相對位置不發生改變。穩定性不能衡量一個算法的優劣
  • 在排序過程中,根據數據元素是否完全存放在內存中,可將排序算法分為兩類:①內部排序, 是指在排序期間元素全部存放在內存中的排序;②外部排序,是指在排序期間元素無法全部同時 存放在內存中,必須在排序的過程中根據要求不斷地在內、外存之間移動的排序。
    一般情況下,內部排序算法在執行過程中都要進行兩種操作:比較和移動。通過比較兩個關鍵字的大小,確定對應元素的前后關系,然后通過移動元素以達到有序。當然,并非所有的內部 排序算法都要基于比較操作,事實上,基數排序就不基于比較操作。
    每種排序算法都有各自的優缺點,適合在不同的環境下使用,就其全面性能而言,很難提出 一種被認為是最好的算法。通常可以將排序算法分為插入排序交換排序選擇排序歸并排序基數排序五大類。內部排序算法的性能取決于算法的時間復雜度和空間復雜度,而時間復雜度一般是由比較和移動的次數決定的。

2. 插入排序

插入排序是一種簡單直觀的排序算法,其基本思想是每次將一個待排序的記錄按其關鍵字大小插入前面已排好序的子序列,直到全部記錄插入完成。由插入排序的思想可以引申出三個重要的排序算法:直接插入排序折半插入排序希爾排序

2.1 直接插入排序

  • 實現對L[1…n]的排序,可以將L(2)~L(n)依次插入前面已排好序的子序列,初始L[1] 可以視為一個已排好序的子序列。上述操作執行n-1次就能得到一個有序的表。插入排序在實現 上通常采用原地排序(空間復雜度為 O(1),因而在從后往前的比較過程中,需要反復把已排序 元素逐步向后挪位,為新元素提供插入空間。
  • 比較次數和移動次數取決于待排序表的初始狀態。
  • 空間復雜度O(1)
  • 時間復雜度:最好O(n) 平均O(n2) 最差O(n2)
  • 穩定性:穩定
  • 適用性:鏈式存儲和順序存儲都適用,鏈式存儲不用移動元素
   static void insertSort(int[] A, int n) {int j, temp;//從第二個位置開始判斷并插入到前面的有序隊列中for (int i = 1; i < n; i++) {//如果發現當前的比有序隊列還小,就進行插入操作if (A[i] < A[i - 1]) {//temp存的是待插入元素temp = A[i];//一個個比較直到找到temp的位置,只要temp小于有序元素,就向后移一位 12355for (j = i - 1; j >= 0 && temp < A[j]; j--) {A[j + 1] = A[j];}//最終的A[j + 1] = temp;}}}

2.2 折半插入排序

  • 從直接插入排序算法中,不難看出每趟插入的過程中都進行了兩項工作:①從前面的有序子 表中查找出待插入元素應該被插入的位置;②給插入位置騰出空間,將待插入元素復制到表中的 插入位置。注意到在該算法中,總是邊比較邊移動元素。下面將比較和移動操作分離,即先折半 查找出元素的待插入位置,然后統一地移動待插入位置之后的所有元素。當排序表為順序表時, 可以對直接插入排序算法做如下改進:因為是順序存儲的線性表,所以查找有序子表時可以用折 半查找來實現
  • 比較次數與待排序表的初始狀態無關。
  • 空間復雜度O(1)
  • 時間復雜度:最好O(n) 平均O(n2) 最差O(n2)
  • 穩定性:穩定
  • 適用性:順序存儲
  static void halfInsertSort(int[] A, int n) {int j, temp, low, high, mid;for (int i = 1; i < n; i++) {if (A[i] < A[i - 1]) {temp = A[i];low = 0;high = i - 1;//查找待排元素位置while (low <= high) {//這個寫法主要是為了避免high特別大的情況,防止溢出 high比low多的分一半給low也就是兩人各自一半mid = low + (high - low) / 2;if (temp < A[mid]) {high = mid - 1;} else {low = mid + 1;}}//最終high的下一個位置就是待插入位置,這里只需要記住high最終會停在真實位置的前一個位置,所以大于high的都向后移動for (j = i - 1; j > high; j--) {A[j + 1] = A[j];}//這里high的下一個位置就是temp真正的位置A[high + 1] = temp;}}}

2.3 希爾排序

從前面的分析可知,直接插入排序算法的時間復雜度為O(n2),但若待排序列為“正序”時, 其時間效率可提高至O(n),由此可見它更適用于基本有序的排序表和數據量不大的排序表。希 排序正是基于這兩點分析對直接插入排序進行改進而得來的,又稱縮小增量排序

  • 希爾排序的基本思想是:先將待排序表分割成若干形如L[i,i+d,i+2d,…,i+kd]的“特殊” 子表,即把相隔某個“增量”的記錄組成一個子表,對各個子表分別進行直接插入排序,當整個 表中的元素已呈“基本有序”時,再對全體記錄進行一次直接插入排序。
  • 空間復雜度O(1)
  • 時間復雜度:最好O(n1.3) 最差O(n2)
  • 穩定性:不穩定
  • 適用性:順序存儲
  public static void shellSort(int[] arr, int n) {// 初始步長int gap = n / 2;// 循環減小增量while (gap > 0) {// 對每個組進行直接插入排序  2, 4, 3, 5, 1, 6for (int i = gap; i < n; i++) {int temp = arr[i];int j = i;/*** 將arr[i]插入到已排序的序列中* arr[j - gap] > temp這里的意思是步長前元素與步長元素比較如果大于步長元素,* 則說明不是有序的,將原本的元素放入步長位置* 且j恢復到原來的位置,繼續比較*/while (j >= gap && arr[j - gap] > temp) {arr[j] = arr[j - gap];j -= gap;}//這里其實就是與最初的元素互換位置arr[j] = temp;System.out.println(Arrays.toString(arr));}// 減小步長gap /= 2;}}

3. 交換排序

所謂交換,是指根據序列中兩個元素關鍵字的比較結果來對換這兩個記錄在序列中的位置。 基于交換的排序算法很多,本書主要介紹冒泡排序快速排序

3.1 冒泡排序

冒泡排序的基本思想是:從后往前(或從前往后)兩兩比較相鄰元素的值,若為逆序(即 A[i-1]>A[i]),則交換它們,直到序列比較完。我們稱它為第一趟冒泡,結果是將最小的元素交換到待排序列的第一個位置(或將最大的元素交換到待排序列的最后一個位置),關鍵字最小 的元素如氣泡一般逐漸往上“漂浮”至“水面”(或關鍵字最大的元素如石頭一般下沉至水底)。 下一趟冒泡時,前一趟確定的最小元素不再參與比較,每趟冒泡的結果是把序列中的最小元素(或 最大元素)放到了序列的最終位置……這樣最多做n-1趟冒泡就能把所有元素排好序。

  • 空間復雜度O(1)
  • 時間復雜度:最好O(n2) 最差O(n2)
  • 穩定性:穩定
  • 適用性:順序存儲和鏈式存儲
    static void bubbleSort(int[] arr, int n) {//給個標記 防止在某一趟已經排好序了還繼續無用的循環 查看是否有元素交換boolean flag = false;for (int i = 0; i < n - 1; i++) {//這里的n-i-1是因為每一趟都會將最大的元素排到最后,也就是只需要排剩下的n-i-1個元素for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {//進入這個if分支里邊,則說明有元素進行了交換//所以將flag=trueflag = true;int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}//在進行完一輪的排序之后,判斷本輪是否發生了元素之間的交換//如果沒有發生交換,說明數組已經是有序的了,則直接結束排序if (!flag) {break;} else {//如果發生了交換,那么在下一輪排序之前將flag再次置為false//以便記錄下一輪排序的時候是否會發生交換flag = false;}}}

3.2 快速排序

快速排序(以下有時簡稱快排)的基本思想是基于分治法的:在待排序表L[1…n]中任取一 個元素 pivot 作為樞軸(或稱基準,通常取首元素),通過一趟排序將待排序表劃分為獨立的兩 部分L[1…k-1]和L[k+1…n],使得L[1…k-1]中的所有元素小于pivot,L[k+1…n]中的所有 元素大于或等于pivot,則pivot放在了其最終位置L(k)上,這個過程稱為一次劃分。然后分 別遞歸地對兩個子表重復上述過程,直至每部分內只有一個元素或為空為止,即所有元素放在了 其最終位置上。

  • 快速排序是所有內部排序算法中平均性能最優的排序算法。
  • 空間復雜度O(1)
  • 時間復雜度:最好O(log2n) 最差O(n2)
  • 穩定性:不穩定
  • 適用性:快速排序僅適用于順序存儲的線性表。
 /*** 快速排序*/private static void quickSort(int[] arr, int low, int high) {if (low < high) {int pivot = partition(arr, low, high);quickSort(arr, low, pivot - 1);quickSort(arr, pivot + 1, high);}}/*** 分區操作,找到基準元素的正確位置,并返回該位置** @param arr* @param low* @param high* @return*/static int partition(int[] arr, int low, int high) {int pivot = arr[low];int i = low;int j = high;while (i < j) {while (i < j && arr[j] >= pivot) {j--;}while (i < j && arr[i] <= pivot) {i++;}if (i < j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}arr[low] = arr[i];arr[i] = pivot;return i;}

4. 選擇排序

選擇排序的基本思想是:每一趟(如第i趟)在后面n-i+1(i=1,2,…,n-1)個待排序元 素中選取關鍵字最小的元素,作為有序子序列的第i個元素,直到第n-1趟做完,待排序元素只 剩下1個,就不用再選。

4.1 簡單選擇排序

假設排序表為 L[1.n],第i趟排序即從L[i…n]中選擇關鍵字最小的元素與L(i)交換,每一趟排序可以確定一個元素的最終位置,這樣經過n-1趟排序就可使得整個排序表有序。

  • 空間復雜度O(1)
  • 時間復雜度:最好O(n2) 最差O(n2)
  • 穩定性:不穩定
  • 適用性:簡單選擇排序適用于順序存儲和鏈式存儲的線性表,以及關鍵字較少的情況。
    static void selectSort(int[] arr, int n) {for (int i = 0; i < n - 1; i++) {int min = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[min]) {min = j;}}if (min != i) {int temp = arr[i];arr[i] = arr[min];arr[min] = temp;}}}

4.2 堆排序

堆的定義如下,n個關鍵字序列L[1…n]稱為堆,當且僅當該序列滿足:
①L(i)>=L(2i)且L(i)>=L(2i+1)或
② L(i)<=L(2i)且L(i)<=L(2i+1)(1≤i≤Ln/2」)
可以將堆視為一棵完全二叉樹,滿足條件①的堆稱為大根堆(大頂堆),大根堆的最大元素 存放在根結點,且其任意一個非根結點的值小于或等于其雙親結點值。滿足條件②的堆稱為小根 堆(小頂堆),小根堆的定義剛好相反,根結點是最小元素。
在這里插入圖片描述
堆排序的思路很簡單:首先將存放在L[1-n]中的n個元素建成初始堆,因為堆本身的特點 (以大頂堆為例),所以堆頂元素就是最大值。輸出堆頂元素后,通常將堆底元素送入堆頂,此時 根結點已不滿足大頂堆的性質,堆被破壞,將堆頂元素向下調整使其繼續保持大頂堆的性質,再 輸出堆頂元素。如此重復,直到堆中僅剩一個元素為止。可見,堆排序需要解決兩個問題:①如何將無序序列構造成初始堆?②輸出堆頂元素后,如何將剩余元素調整成新的堆?

  • 空間復雜度O(1)
  • 時間復雜度:最好O(nlog2n) 平均O(nlog2n) 最壞O(nlog2n)
  • 穩定性:不穩定
  • 適用性:適用于順序存儲。
  public static void heapSort(int[] arr, int n) {//初始化堆for (int i = n / 2 - 1; i >= 0; i--) {adjustHeap(arr, i, n);}for (int i = n - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;adjustHeap(arr, 0, i);}}public static void adjustHeap(int[] arr, int i, int n) {while (true) {int l = 2 * i + 1;int r = 2 * i + 2;int index = i;if (l < n && arr[l] > arr[index]) {index = l;}if (r < n && arr[r] > arr[index]) {index = r;}if (i != index) {int temp = arr[index];arr[index] = arr[i];arr[i] = temp;i = index;} else {break;}}}

5. 歸并排序、基數排序和計數排序

5.1 歸并排序

歸并排序與上述基于交換、選擇等排序的思想不一樣,歸并的含義是將兩個或兩個以上的有 序表合并成一個新的有序表。假定待排序表含有n個記錄,則可將其視為n個有序的子表,每個 子表的長度為1,然后兩兩歸并,得到「n/2]個長度為2或1的有序表;繼續兩兩歸并……如此重 復,直到合并成一個長度為n的有序表為止,這種排序算法稱為二路歸并排序。
在這里插入圖片描述

  • 空間復雜度O(n)
  • 時間復雜度:O(nlog2n)
  • 穩定性:穩定
  • 適用性:適用于順序存儲和鏈式存儲。
public static void mergeSort(int[] arr, int left, int right) {//確保不會越界if (left < right) {//從中間劃分兩個序列int mid = left + (right - left) / 2;//左邊部分mergeSort(arr, left, mid);//右邊部分mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}}public static void merge(int[] arr, int left, int mid, int right) {int[] temp = new int[right - left + 1];//左邊子數組的第一個元素。int i = left;//右邊子數組的第一個元素int j = mid + 1;int k = 0;//當 i 和 j 都在各自子數組范圍內時循環。while (i <= mid && j <= right) {//誰小把誰放進temp數組if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}//走到這里說明上面有一個已經放完了所有元素,可能另外一個數組還有元素則繼續加入temp數組while (i <= mid) {temp[k++] = arr[i++];}while (j <= right) {temp[k++] = arr[j++];}// 將臨時數組的結果拷貝回原數組for (int m = 0; m < temp.length; m++) {arr[left + m] = temp[m];}}

4.2 基數排序

基數排序是一種很特別的排序算法,它不基于比較和移動進行排序,而基于關鍵字各位的大 小進行排序。基數排序是一種借助多關鍵字排序的思想對單邏輯關鍵字進行排序的方法。
在這里插入圖片描述
在這里插入圖片描述

  • 空間復雜度O?
  • 時間復雜度:O(d(n+r))
  • 穩定性:穩定
  • 適用性:適用于順序存儲和鏈式存儲。

4.3 計數排序

計數排序也是一種不基于比較的排序算法。計數排序的思想是:對每個待排序元素x,統計 小于x的元素個數,利用該信息就可確定x的最終位置。例如,若有8個元素小于x,則x就排 在第9號位置上。當有幾個元素相同時,該排序方案還需做一定的優化。

   static int[] countSort(int[] arr) {//1.得到數列的最大值與最小值,并算出差值dint max = arr[0];int min = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}if (arr[i] < min) {min = arr[i];}}int d = max - min;//2.創建基于差值長度的統計數組并統計填充對應元素個數int[] countArray = new int[d + 1];for (int i = 0; i < arr.length; i++) {countArray[arr[i] - min]++;}//3.統計數組變形,后面的元素等于前面的元素之和for (int i = 1; i < countArray.length; i++) {countArray[i] = countArray[i] + countArray[i - 1];}int[] output = new int[arr.length];//保證原來元素的順序 保持穩定for (int i = arr.length - 1; i >= 0; i--) {//arr[i] - min真正在countArray中的索引位置output[countArray[arr[i] - min] - 1] = arr[i];//避免相同的元素放在同一個位置 應該放在自己對應的位置countArray[arr[i] - min]--;}return output;}

6. 各種內部排序算法的比較及應用

  1. 從時間復雜度看:簡單選擇排序、直接插入排序和冒泡排序平均情況下的時間復雜度都為 O(n2),且實現過程也較為簡單,但直接插入排序和冒泡排序最好情況下的時間復雜度可以達到 O(n),而簡單選擇排序則與序列的初始狀態無關。希爾排序作為插入排序的拓展,對較大規模的 數據都可以達到很高的效率,但目前未得出其精確的漸近時間。堆排序利用了一種稱為堆的數據 結構,可以在線性時間內完成建堆,且在O(nlog2n)內完成排序過程。快速排序基于分治的思想, 雖然最壞情況下的時間復雜度會達到O(n2),但快速排序的平均性能可以達到O(nlogn),在實際 應用中常常優于其他排序算法。歸并排序同樣基于分治的思想,但由于其分割子序列與初始序列 的排列無關,因此它的最好、最壞和平均時間復雜度均為O(nlog2n)。
  2. 從空間復雜度看:簡單選擇排序、插入排序、冒泡排序、希爾排序和堆排序都僅需借助常數 個輔助空間。快速排序需要借助一個遞歸工作棧,平均大小為
    O(log2n),當然在最壞情況下可能會增長到O(n)。二路歸并排序在合并操作中需要借助較多的輔助空間用于元素復制,大小為0(n),
    雖然有方法能克服這個缺點,但其代價是算法會很復雜而且時間復雜度會增加。
  3. 從穩定性看:插入排序、冒泡排序、歸并排序和基數排序是穩定的排序算法,而簡單選擇排 序、快速排序、希爾排序和堆排序都是不穩定的排序算法。平均時間復雜度為O(nlogn)的穩定排
    序算法只有歸并排序,對于不穩定的排序算法,只需舉出一個不穩定的實例即可。
  4. 從適用性看:折半插入排序、希爾排序、快速排序和堆排序適用于順序存儲。直接插入排序、冒泡排序、簡單選擇排序、歸并排序和基數排序既適用于順序存儲,又適用于鏈式存儲。
    在這里插入圖片描述

7. 外部排序

① 外部排序指的是大文件的排序,即待排序的記錄存儲在外存中,待排序的文件無法一次性裝入內存,需要在內存和外存之間進行多次數據交換,以達到排序整個文件的目的。
② 為減少平衡歸并中外存讀/寫次數所采取的方法:增大歸并路數和減少歸并段個數。
③ 利用敗者樹增大歸并路數。
④ 利用置換-選擇排序增大歸并段長度來減少歸并段個數。 ⑤ 由長度不等的歸并段進行多路平衡歸并,需要構造最佳歸并樹。
許多應用中,經常需要對大文件進行排序,因為文件中的記錄很多,無法將整個文件復制進內存中進行排序。因此,需要將待排序的記錄存儲在外存上,排序時再把數據一部分一部分地調入內存進行排序,在排序過 程中需要多次進行內存和外存之間的交換。這種排序算法就稱為外部排序

8. 一些常見結論

  • 選擇排序、快速排序、希爾排序、堆排序不是穩定的排序算法。【選快希堆】
  • 冒泡排序、插入排序、歸并排序、基數排序是穩定的排序算法。【直冒歸基】
  • 簡單選擇排序則與序列的初始狀態無關

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

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

相關文章

Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon

文章目錄 Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon什么是 Swap&#xff1f;主要命令介紹1. mkswap2. mkfs.swap3. swapon 創建和管理 Swap 的步驟1. 創建 Swap 分區2. 初始化 Swap3. 激活 Swap4. 持久化配置5. 查看 Swap 狀態 刪除 Swap 分區或文件1. 停用 Swap2. 刪…

取子串(指針)

#include <stdio.h> #include <string.h>char* substr(char *s, int startloc, int len) {static char result[51]; // 定義一個足夠大的靜態數組來存儲結果static char result1[] {N,U,L,L,\0};int i, j;// 檢查startloc是否在字符串的范圍內if (startloc < 1…

「Mac暢玩鴻蒙與硬件45」UI互動應用篇22 - 評分統計工具

本篇將帶你實現一個評分統計工具&#xff0c;用戶可以對多個選項進行評分。應用會實時更新每個選項的評分結果&#xff0c;并統計平均分。這一功能適合用于問卷調查或評分統計的場景。 關鍵詞 UI互動應用評分統計狀態管理數據處理多目標評分 一、功能說明 評分統計工具允許用…

類與對象的理解

面向對象中兩個重要的概念&#xff1a;類與對象 類 簡單理解&#xff0c;它指的是類型或者分類或某個模塊 比如&#xff1a;人類、動物類……&#xff1b;入公司的入職單&#xff0c;沒寫上任何人的情況下 對象 簡單理解&#xff0c;它指的具體的個體 備注&#xff1a;對…

遞歸實現指數型枚舉(遞歸)

92. 遞歸實現指數型枚舉 - AcWing題庫 每個數有選和不選兩種情況 我們把每個數看成每層&#xff0c;可以畫出一個遞歸搜索樹 葉子節點就是我們的答案 很容易寫出每dfs函數 dfs傳入一個u表示層數 當層數大于我們n時&#xff0c;去判斷每個數字的選擇情況&#xff0c;輸出被選…

Linux相關概念和易錯知識點(25)(信號原理、操作系統的原理、volatile)

目錄 1.信號的產生 &#xff08;1&#xff09;kill &#xff08;2&#xff09;raise、abort 2.對block、pending、handler表的管理 &#xff08;1&#xff09;信號集&#xff08;sigset_t&#xff09; &#xff08;2&#xff09;block表的管理 ①操作相關的函數 ②sigpr…

opencv中的色彩空間及其轉換

在 OpenCV 中&#xff0c;色彩空間&#xff08;Color Space&#xff09;指的是表示顏色的一種方式&#xff0c;或是用數學模型對顏色的表達。不同的色彩空間采用不同的方式來描述顏色的三要素&#xff08;如亮度、飽和度、色調&#xff09;&#xff0c;因此可以在不同的應用場景…

OPPO 數據分析面試題及參考答案

如何設計共享單車數據庫的各個字段? 對于共享單車的數據庫設計,首先考慮用戶相關的字段。用戶表可以包含用戶 ID,這是一個唯一標識符,用于區分不同用戶;姓名,記錄用戶的真實姓名;聯系方式,比如手機號碼,方便在出現問題時聯系用戶;注冊時間,記錄用戶何時開始使用共享…

在Ubuntu下運行QEMU仿真FreeBSD riscv64系統

在Ubuntu下運行QEMU仿真FreeBSD riscv64系統 突發奇想&#xff0c;嘗試在Ubuntu下運行QEMU仿真FreeBSD riscv64系統&#xff0c; 參考這篇文檔&#xff1a;手把手教你在QEMU上運行RISC-V Linux_qemu 運行 .bin-CSDN博客 并參考FreeBSD的Wiki&#xff1a;riscv - FreeBSD Wik…

大模型微調---Prompt-tuning微調

目錄 一、前言二、Prompt-tuning實戰2.1、下載模型到本地2.2、加載模型與數據集2.3、處理數據2.4、Prompt-tuning微調2.5、訓練參數配置2.6、開始訓練 三、模型評估四、完整訓練代碼 一、前言 Prompt-tuning通過修改輸入文本的提示&#xff08;Prompt&#xff09;來引導模型生…

Visual Studio 、 MSBuild 、 Roslyn 、 .NET Runtime、SDK Tools之間的關系

1. Visual Studio Visual Studio 是一個集成開發環境&#xff08;IDE&#xff09;&#xff0c;為開發者提供代碼編寫、調試、測試和發布等功能。它內置了 MSBuild、Roslyn 和 SDK Tools&#xff0c;并提供圖形化界面來方便開發者進行項目管理和構建。與其他組件的關系&#xf…

Winnows基礎(2)

Target 了解常見端口及服務&#xff0c;熟練cmd命令&#xff0c;編寫簡單的 .bat 病毒程序。 Trail 常見服務及端口 80 web 80-89 可能是web 443 ssl心臟滴血漏洞以及一些web漏洞測試 445 smb 1433 mssql 1521 oracle 2082/2083 cpanel主機管理系統登陸&#xff08;國外用的…

Edge Scdn用起來怎么樣?

Edge Scdn&#xff1a;提升網站安全與性能的最佳選擇 在當今互聯網高速發展的時代&#xff0c;各種網絡攻擊層出不窮&#xff0c;特別是針對網站的DDoS攻擊威脅&#xff0c;幾乎每個行業都可能成為目標。為了確保網站的安全性與穩定性&#xff0c;越來越多的企業開始關注Edge …

通信技術以及5G和AI保障電網安全與網絡安全

摘 要&#xff1a;電網安全是電力的基礎&#xff0c;隨著智能電網的快速發展&#xff0c;越來越多的ICT信息通信技術被應用到電力網絡。本文分析了歷史上一些重大電網安全與網絡安全事故&#xff0c;介紹了電網安全與網絡安全、通信技術與電網安全的關系以及相應的電網安全標準…

梯度(Gradient)和 雅各比矩陣(Jacobian Matrix)的區別和聯系:中英雙語

雅各比矩陣與梯度&#xff1a;區別與聯系 在數學與機器學習中&#xff0c;梯度&#xff08;Gradient&#xff09; 和 雅各比矩陣&#xff08;Jacobian Matrix&#xff09; 是兩個核心概念。雖然它們都描述了函數的變化率&#xff0c;但應用場景和具體形式有所不同。本文將通過…

時間序列預測論文閱讀和相關代碼庫

時間序列預測論文閱讀和相關代碼庫列表 MLP-based的時間序列預測資料DLinearUnetTSFPDMLPLightTS 代碼庫以及論文庫&#xff1a;Time-Series-LibraryUnetTSFLightTS MLP-based的時間序列預測資料 我會定期把我的所有時間序列預測論文有關的資料鏈接全部同步到這個文章中&#…

引言和相關工作的區別

引言和相關工作的區別 引言 目的與重點 引言主要是為了引出研究的主題,向讀者介紹為什么這個研究問題是重要且值得關注的。它通常從更廣泛的背景出發,闡述研究領域的現狀、面臨的問題或挑戰,然后逐漸聚焦到論文要解決的具體問題上。例如,在這篇關于聯邦學習數據交易方案的…

GitLab分支管理策略和最佳實踐

分支管理是 Git 和 GitLab 中非常重要的部分&#xff0c;合理的分支管理可以幫助團隊更高效地協作和開發。以下是一些細化的分支管理策略和最佳實踐&#xff1a; 1. 分支命名規范 ? 主分支&#xff1a;通常命名為 main 或 master&#xff0c;用于存放穩定版本的代碼。 ? …

批量提取zotero的論文構建知識庫做問答的大模型(可選)——含轉存PDF-分割統計PDF等

文章目錄 提取zotero的PDF上傳到AI平臺保留文件名代碼分成20個PDF視頻講解 提取zotero的PDF 右鍵查看目錄 發現目錄為 C:\Users\89735\Zotero\storage 寫代碼: 掃描路徑‘C:\Users\89735\Zotero\storage’下面的所有PDF文件,全部復制一份匯總到"C:\Users\89735\Downl…

LabVIEW實現NB-IoT通信

目錄 1、NB-IoT通信原理 2、硬件環境部署 3、程序架構 4、前面板設計 5、程序框圖設計 6、測試驗證 本專欄以LabVIEW為開發平臺,講解物聯網通信組網原理與開發方法,覆蓋RS232、TCP、MQTT、藍牙、Wi-Fi、NB-IoT等協議。 結合實際案例,展示如何利用LabVIEW和常用模塊實現物聯網…