【基礎算法總結】分治—歸并

分治—歸并

  • 1.排序數組
  • 2.交易逆序對的總數
  • 3.計算右側小于當前元素的個數
  • 4.翻轉對

在這里插入圖片描述

點贊👍👍收藏🌟🌟關注💖💖
你的支持是對我最大的鼓勵,我們一起努力吧!😃😃

1.排序數組

題目鏈接:912. 排序數組

題目描述:

在這里插入圖片描述

算法原理:

歸并排序的核心思想就是,選一個中間節點,將數組分成左右兩區間,先將左邊排排序相當于又是一個歸并過程,選一個中間節點然后在把左邊排序,當區間只有一個元素就可以向上返回。左邊拍完序,在對右邊排排序,當左右排好序后在合并,選擇小的插入,然后拷貝回原數組。

在這里插入圖片描述
快速排序就是選擇一個key將數組分塊,然后左右繼續指向數組分塊的核心操作,當數組被分成一個元素或者沒有元素就結束分塊。

所以說快排和歸并非常類似,無非就是處理數組時間不一樣。歸并畫成樹就是一個后序,先處理左在處理右然后將左右合并,快排就是一個前序,先把數組分兩塊,然去搞左邊,左邊還是找一個key然后分成左和右。。。

在這里插入圖片描述

class Solution {
public:vector<int> tmp;vector<int> sortArray(vector<int>& nums) {int n = nums.size();tmp.resize(n);Mergesort(nums, 0, n-1);return nums;}void Mergesort(vector<int>& nums, int left, int right){if(left >= right) return;// 1. 選擇中間點劃分區間int mid = left + (right - left) / 2;//[left ,mid] [mid+1, right]// 2.把左右區間排序Mergesort(nums, left, mid);Mergesort(nums, mid + 1, right);// 3.合并兩個有序數組int cur1= left, cur2 = mid + 1, i = 0;while(cur1 <= mid && cur2<= right)tmp[i++] = nums[cur1] < nums[cur2] ? nums[cur1++] : nums[cur2++];while(cu1 <= mid) tmp[i++] = nums[cur1++];while(cur2<= right) tmp[i++] = nums[cur2++];// 4.拷貝回原數組for(int i = left; i <= right; ++i)nums[i] = tmp[i - left];}
};

2.交易逆序對的總數

題目鏈接:LCR 170. 交易逆序對的總數

題目分析:

在這里插入圖片描述
逆序對是兩個數前面的數比后面的大就是逆序對。

算法原理:

解法一:暴力解法->暴力枚舉
把所有二元組枚舉出來看看是不是逆序對。兩層for循環,但是超時。

如果想求整個數組的逆序對的時候,我把數組按照中間點分成兩部分,然后求整個數組逆序對的時候,先求出左邊逆序對的個數假設是a,在求出右邊逆序對的個數假設是b,然后左邊挑一個數右邊挑一個數求出一左一右的逆序對個數假設是c。那a+b+c 就是整個逆序對個數。因為本質還是暴力枚舉。
在這里插入圖片描述

接下來我們在擴展一下,左半部分挑完之后排個序,右半部分跳完之后也排個序,然后左右都有序了在一左一右挑。這也是正確的,因為左半部分挑出來a后在排序不會影響結果, 右半部分挑出來b后在排序也不會影響結果。無非影響的是一左一右。但是我們左邊挑一個右邊挑一個是不管順序的。我們從左邊挑選一個數,然后在從右邊挑選比我小的數的個數就行了,從右邊挑選一個數,然后在從左邊挑選比我大的數的個數就行了,至于有沒有序和我沒關系。

在這里插入圖片描述
當到這里的時候你會發現其實就是一個歸并排序。

解法二:利用歸并排序解決問題

選擇中間點把數組分成兩份,先去左區間找,如果左區間太大還可以在選個中間點在把數組分開直到不能分了就找逆序對,同理右邊也是。最后一左一右去找逆序對,這個策略正好對應歸并的過程。左半部分和右邊部分可以在遞歸中完成,我們的核心就是解決一左一右。同樣左邊部分+左排序放在一起遞歸中完整,右半部分+右排序放在一起遞歸完成,我們核心還是處理一左一右。因為遞歸都是的統一,所以一左一右后面在加一個排序。

左半部分 + 左排序 + 右半部分 + 右排序 + 一左一右 + 排序

這個時候有個小問題為什么非要排序呢?
雖然會有空間的開銷,但是會變得非常快。

利用歸并排序后,數組左右區間已經是有序的了。假設是升序的。cur1和cur2之前的都是都是比cur1和cur2小的元素。
在這里插入圖片描述
此時統計逆序對的話,按照如下策略可以一次找到一堆逆序對。

策略一:找出該數之前,多少個數比我大
此時我們固定的是cur2,因為我們是一左一右找,想要找比我大的數,盯的是后面的數,去看看左半部分有多少個比我大。此時就和歸并排序完美契合。無非就是三種情況。

當 nums[cur1] < nums[cur2],說明還沒有在左邊找到比cur2大,所以cur1++

當 nums[cur1] == nums[cur2],還是沒有在左邊找到比cur2大,所以cur1++

上面兩種情況可以合在一起
nums[cur1] <= nums[cur2], cur1++,注意別忘記放進歸并數組里。

nums[cur1] > num[cur2] ,當前cur1比cur2元素大,別忘記我們可是升序數組,而且cur1比cur2的時候是cur1第一次出現比cur2大,cur1后面的元素都是比cur2大的!此時我們就是根據歸并排序的一次比較就找到一堆cur1比cur2大的數。此時用一個變量記錄一下cur1位置到左邊結束的位置的個數就可以了。ret += mid - cur1 + 1,一次就統計出來一大堆。而且cur1比cur2大的時候,我們下一次想讓cur2向后移,這正好和歸并排序一樣,讓小的往后移。

時間復雜度O(nlogn)
在這里插入圖片描述

當前策略 找出該數之前,多少個數比我大,對于數組升序是沒問題的,那這個數組是降序的能不能解決這個問題,只要找比我大的不管升序還是降序都是固定cur2,在左邊找比cur2大的。

此時如果nums[cur1] > nums[cur2] ,要統計左邊開始到cur1有多個元素,但是有一個致命問題,cur1往前走一步的位置可能繼續比cur2大,還是要統計左邊開始到cur1有多個元素。然后你就會發現重復了。

在這里插入圖片描述

因此 策略一 :找出該數之前,多少個數比我大 只能是升序,不能是降序!
固定cur2
在這里插入圖片描述

那降序就沒有用武之地了嘛?并不是。

策略二 :找出該數之后,有多少個數比我小 只能是降序

固定cur1,在右邊部分找比cur1小的。當cur1比cur2大的時候,cur2是第一個出現的因為又是降序所以cur1比cur2后面元素都大,此時直接統計個cur2到右區間的個數 ret += right - cur2 + 1。而且統計完個數之后,已經把比cur1小的都找到了,此時讓cur1右移,而且正好和歸并排序是一樣的。
在這里插入圖片描述

如果是升序的話也會有重復計算的問題。

在這里插入圖片描述

至此算法原理就結束了,其實就是利用前兩部分析出來這道題可以用分治的方法來做。想求整個數組的逆序數,我可以先求左區間逆序數,在求右區間逆序數,然后一左一右挑一個求逆序數。所以這就是一個分支。然后發現數組有序的話可以通過一次比較統計一大推,因此可以用歸并排序來解決這個問題。

class Solution {vector<int> tmp;
public:int reversePairs(vector<int>& record) {int n = record.size();tmp.resize(n);return Mergesort(record, 0, n - 1);}int Mergesort(vector<int>& nums, int left, int right){if(left >= right) return 0;int ret = 0;// 1.找中間節點,將數組分成兩部分int mid = (left + right) >> 1;//[left,mid] [mid+1,right]// 2. 左邊的個數 + 排序  +  右邊的個數 + 排序ret += Mergesort(nums, left, mid);ret += Mergesort(nums, mid + 1, right);// 3. 一左一右的個數int cur1 = left, cur2 = mid + 1, i = 0;// while(cur1 <= mid && cur2 <= right) //升序// {//     if(nums[cur1] <= nums[cur2])//     {//         tmp[i++] = nums[cur1++];//     }//     else//     {//         ret += mid - cur1 + 1;//         tmp[i++] = nums[cur2++];//     }// }while(cur1 <= mid && cur2 <= right) //降序{if(nums[cur1] <= nums[cur2]){tmp[i++] = nums[cur2++];}else{ret += right - cur2 + 1;tmp[i++] = nums[cur1++];}}// 4. 處理一下排序while(cur1 <= mid) tmp[i++] = nums[cur1++];while(cur2 <= right) tmp[i++] = nums[cur2++];for(int j = left; j <= right; ++j)nums[j] = tmp[j - left];return ret;}
};

3.計算右側小于當前元素的個數

題目鏈接:315. 計算右側小于當前元素的個數

題目分析:

在這里插入圖片描述

給一個nums數組,返回一個count數組,count[i] 的值是 對應nums[i] 右側小于 nums[i] 的元素的數量。

這也是求逆序對,但并不是求總體的逆序對個數,而是每個數的逆序對個數。
在這里插入圖片描述

就是給一個數看看右邊比我少的有多少個。我們也是可以按照歸并排序來處理這個問題,但難得就是這返回數組怎么搞。

算法原理:

解法:歸并排序
選擇一個中間點,將數組分成左右兩部分,先在左半部分找,在到右半部分找,然后一左一右找。

左半部分 + 排序 + 右半部分 + 排序 + 一左一右 + 排序

策略二: 找出該數之后,有多少個數比我小 只能是降序
固定cur1

當 nums[cur1] <= nums[cur2] ,因為是降序此時并沒有找到有多少個元素比cur1小,所以不更新結果讓cur2++

當 nums[cur1] > nums[cur2] ,第一次出現cur1比cur2,因為是降序所以此時cur2后面所有元素都比cur1小,此時可以統計一大堆,但是我們這里可不是搞一個ret來記錄,而是搞一個數組,要把nums[cur1] 對應的 index(下標) 里面的 ret += right - cur2 +1

在這里插入圖片描述

就比如這個數組,當計算出比當前位置元素小的個數是要把結果記錄到這個元素對應的位置上的。
在這里插入圖片描述
因此當算出nums[cur1]右邊有多少個比我小的時候,最終加的結果是這個值對應的原始下標對應的值 += right - cur2 + 1。

所以我們著重要解決的問題是,當我們找到當前位置的值右邊有多少個比我小的時候,我要能找到這個值得原始下標。 找到 nums 中當前元素的原始下標是多少? 因為排完序后原本數對應的下標就已經亂了!當前位置cur1 可能并不是我真實的下標。

可能你會想到用哈希表,但是,如果數組里面有重復元素,就難搞了。所以我們直接搞一下和原始數組大小的index數組,記錄當前元素的原始下標。不管nums里面怎么辦,就把index和nums里面對應的值綁定!nums里面的值動,index里面的值也動! 這樣就可以通過index里面值找到當前值原始下標在哪里,然后就可以加了。

在這里插入圖片描述

回歸上面的問題 把nums[cur1] 對應的 index(下標) 里面的 ret += right - cur2 +1 就可以變成這樣 ret[index[cur1]] += ret += right - cur2 +1。

當歸并排序移動nums時,我們要合并兩個有序數組,別忘記我們需要一個tmp輔助數組幫助我們合并。那如何讓nums合并,index也同步綁定呢? 因此需要兩個tmp輔助數組!

class Solution {vector<int> ret; vector<int> tmpNum;vector<int> tmpIndex;vector<int> index; // 記錄 nums 中當前元素的原始下標
public:vector<int> countSmaller(vector<int>& nums) {int n = nums.size();ret.resize(n);tmpNum.resize(n);tmpIndex.resize(n);index.resize(n);for(int i = 0; i < n; ++i) index[i] = i; // 初始化 index 數組Mergesort(nums, 0, n - 1);return ret;}void Mergesort(vector<int>& nums, int left, int right){if(left >= right) return;// 1. 根據中間點,劃分區間int mid = left + (right - left) / 2;//[left, mid] [mid+1, right]// 2. 先處理左右兩部分Mergesort(nums, left, mid);Mergesort(nums, mid + 1, right);// 3. 處理一左一右的情況int cur1 = left, cur2 = mid + 1, i = 0;while(cur1 <= mid && cur2 <= right) // 降序{if(nums[cur1] <= nums[cur2]){tmpNum[i] = nums[cur2];tmpIndex[i++] = index[cur2++];}else{ret[index[cur1]] += right - cur2 + 1;tmpNum[i] = nums[cur1];tmpIndex[i++] = index[cur1++];}}// 4.處理剩下排序過程while(cur1 <= mid){tmpNum[i] = nums[cur1];tmpIndex[i++] = index[cur1++];}while(cur2 <= right){tmpNum[i] = nums[cur2];tmpIndex[i++] = index[cur2++];}for(int i = left; i <= right; ++i){nums[i] = tmpNum[i - left];index[i] = tmpIndex[i- left];}}
};

4.翻轉對

題目鏈接:493. 翻轉對

題目分析:

在這里插入圖片描述

當 i < j 且 nums[i] > 2*nums[j],才是翻轉對。
在這里插入圖片描述
算法原理:

解法:分治

這個問題你會發現和求逆序對非常相似的,想求整個數組的翻轉對,先求左半部分的翻轉對記為a,在求右半部分的翻轉對記為b,然后求一左一右的翻轉對記為c。a+b+c就是整個數組的翻轉對。

這個就有個致命的問題,逆序對的題和歸并排序完美契合,僅需比較
i < j,nums[i] > nums[j] 。但是這道題要比較的是 i < j,nums[i] > 2 * nums[j]。這個時候就不能按照歸并排序的流程求翻轉對了,我們要重新想一個策略來求翻轉對。

我們依舊用的是分治的策略來解決,但是并不是用的是歸并排序里面的一個過程來解決我們的問題,我們是在歸并排序之前來計算翻轉對個數。因為我們要利用兩個區間有序的性質,我們可以在一次歸并中用O(N)的時間復雜度搞定這一層的翻轉對的個數

計算翻轉對

策略一:計算當前元素后面,有多少元素的兩倍比我小。 降序
固定cur1

整個數組都是降序的,固定cur1,當 2 * nums[cur2] >= nums[cur1] cur2往后移,
當 2 * nums[cur2] < nums[cur1] ,因為是降序的,cur2后面一堆元素2倍都比cur1小,所以 ret += right - cur2 +1, cur1的翻轉對都找完了所以往后移動就行了。注意cur2此時是不用回溯的!因為數組是降序的,cur2之前的元素都比cur1還沒有移動的2倍大,cur1往后走一步元素變小了,那cur2之前不就比當前cur1位置更大嘛,所以不用回溯,如果回溯時間復雜度 計算翻轉對就是O(n^2),那整體時間復雜度就變成O(n ^2 logn)。直到cur1到尾或者cur2到尾就結束了。

計算翻轉對:利用單調性,使用同向雙指針。

在這里插入圖片描述

策略二:計算當前元素之前,有多少元素的一半比我大。 升序
固定cur2

整個數組都是升序的,固定cur2,當 nums[cur1] / 2 <= nums[cur1] cur1往后移,
當 nums[cur1] / 2 > nums[cur2] ,因為是升序的,cur1后面一堆元素的一半都比cur2大,所以 ret += mid - left +1, cur2的翻轉對都找完了所以往后移動就行了。此時cur1也不需要回溯。因為是數組是升序的,cur2往后走一步是變大的,cur1還沒有往后移動之前前面的元素一半都比cur2小,現在cur往后走一步變大,肯定比cur1還沒有往后移動之前更大,所以cur1不需要回溯。
在這里插入圖片描述

注意上面只是計算翻轉對,別忘記還要還要合并兩個有序數組。

降序

class Solution {vector<int> tmp;
public:int reversePairs(vector<int>& nums) {int n = nums.size();tmp.resize(n);return Mergesort(nums, 0, n - 1);}int Mergesort(vector<int>& nums, int left, int right){if(left >= right) return 0;int ret = 0;// 1. 選擇中間點將數組劃分區間int mid = (left + right) >> 1;// 2. 先計算左右兩側的翻轉對ret += Mergesort(nums, left, mid);ret += Mergesort(nums, mid + 1, right);// 3. 先計算翻轉對的數量int cur1 = left, cur2 = mid + 1; while(cur1 <= mid && cur2 <= right)//降序{//if(2 * nums[cur2] < nums[cur1]) //乘法溢出 改成 除法if(nums[cur2] < nums[cur1] / 2.0){ret += right - cur2 + 1;cur1++;}else cur2++;}// 4. 合并兩個有序數組cur1 = left, cur2 = mid + 1;int i = left;while(cur1 <= mid && cur2 <= right){if(nums[cur2] < nums[cur1]) tmp[i++] = nums[cur++];else tmp[i++] = nums[cur2++];}while(cur1 <= mid) tmp[i++] = nums[cur1++];while(cur2 <= right) tmp[i++] = nums[cur2++];for(int j = left; j <= right; ++j) nums[j] = tmp[j];return ret;     }
};

升序

class Solution {vector<int> tmp;
public:int reversePairs(vector<int>& nums) {int n = nums.size();tmp.resize(n);return Mergesort(nums, 0, n - 1);}int Mergesort(vector<int>& nums, int left, int right){if(left >= right) return 0;int ret = 0;// 1. 選擇中間點將數組劃分區間int mid = (left + right) >> 1;// 2. 先計算左右兩側的翻轉對ret += Mergesort(nums, left, mid);ret += Mergesort(nums, mid + 1, right);// 3. 先計算翻轉對的數量int cur1 = left, cur2 = mid + 1; while(cur1 <= mid && cur2 <= right)//升序{//if(2 * nums[cur2] < nums[cur1]) //乘法溢出 改成 除法if(nums[cur2] < nums[cur1] / 2.0){ret += mid - cur1 + 1;cur2++;}else cur1++;}// 4. 合并兩個有序數組cur1 = left, cur2 = mid + 1;int i = left;while(cur1 <= mid && cur2 <= right){if(nums[cur2] < nums[cur1]) tmp[i++] = nums[cur2++];else tmp[i++] = nums[cur1++];}while(cur1 <= mid) tmp[i++] = nums[cur1++];while(cur2 <= right) tmp[i++] = nums[cur2++];for(int j = left; j <= right; ++j) nums[j] = tmp[j];return ret;   }
};

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

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

相關文章

NFTScan | 07.01~07.07 NFT 市場熱點匯總

歡迎來到由 NFT 基礎設施 NFTScan 出品的 NFT 生態熱點事件每周匯總。 周期&#xff1a;2024.07.01~ 2024.07.07 NFT Hot News 01/ 數據&#xff1a;Mad Lads 地板價回升至 100 SOL 上方&#xff0c;24 小時漲幅為 13.65% 7 月 1 日&#xff0c;據數據顯示&#xff0c;Solana…

ARM架構以及程序運行解析

文章目錄 1. ARM架構 2. ARM處理器程序運行的過程 3. 示例 3. 基于ARM架構的STM32單片機 1. 運行模式 2. 寄存器組 3. STM32的基本結構 4. STM32的運行模式 4. 寄存器組詳解 1. 未備份寄存器 2. 備份寄存器 3. 程序計數器 4. 程序狀態寄存器 5. CPSR和SPSR寄存器…

【Unity】UGUI的基本介紹

Unity的UGUI&#xff08;Unity User Interface&#xff09;是Unity引擎內自帶的UI系統&#xff0c;官方稱之為UnityUI&#xff0c;是目前Unity商業游戲開發中使用最廣泛的UI系統開發解決方案。以下是關于Unity的UGUI的詳細介紹&#xff1a; 一、UGUI的特點 靈活性&#xff1a…

Trick : 10^x 以內最多的因子數

Trick : 1 0 x 10^x 10x 以內最多的因子數 1 0 5 10^5 105 以內具有最多的因子數的數是 83160&#xff0c;它有 128 個因子 ; 1 0 6 10^6 106 以內具有最多因子數的數是 720720&#xff0c;它有 240 個因子 ; 所以遇到需要枚舉因子的&#xff0c;預處理之后大膽枚舉就可以&…

Python 爬蟲 tiktok API接口獲取tiktok用戶關注列表

此接口可獲取tiktok用戶關注列表。若有需要&#xff0c;請點擊文末鏈接聯系我們。 詳細采集頁面如下https://www.tiktok.com/quanap_official 請求API http://api.xxxx.com/tt/user/following?user_id7252644648840381445&count10&offset0&tokentest 請求參數 返…

Impala寫Parquet文件

Impala Parquet相關代碼 https://github.com/cloudera/Impala/search?l=cpp&q=parquet&ref=cmdform 沒有可重用的庫接口,需要在代碼里去看,提取出來,直接使用源碼。 調用關系如下(自右向左調用): HdfsParquetTableWriter(HdfsTableWriter)<-HdfsTableSink<…

改進Transformer模型其實也不難

聲明&#xff1a;文章是從本人公眾號中復制而來&#xff0c;因此&#xff0c;想最新最快了解各類智能優化算法及其改進的朋友&#xff0c;可關注我的公眾號&#xff1a;強盛機器學習&#xff0c;不定期會有很多免費代碼分享~ 目錄 原理簡介 數據介紹 結果展示 完整代碼 之前…

列表(定義、引用、修改、切片和用途)

什么是列表 列表是 Python 中最常用的數據類型之一。它是一種有序、可變&#xff0c;異構的數據集合&#xff0c;可以存儲多個不同類型的元素。 列表的特點 列表是 Python 中的一種數據結構&#xff0c;具有以下特點&#xff1a; 有序性&#xff1a; 列表中的元素按照添加的…

【學術會議征稿】第五屆計算機工程與智能控制學術會議(ICCEIC 2024)

第五屆計算機工程與智能控制學術會議&#xff08;ICCEIC 2024) 2024 5th International Conference on Computer Engineering and Intelligent Control 第五屆計算機工程與智能控制學術會議&#xff08;ICCEIC 2024&#xff09;將于2024年10月18日至22日在廣州舉辦&#xff0…

improved-diffusion代碼逐行理解之train

目錄 代碼理解1、解析命令行參數2、分布式設置和日志配置3、創建模型和擴散過程4、加載數據5、訓練循環6、訓練過程中的關鍵點7、日志和模型保存 代碼 improved-diffusion代碼地址&#xff1a;https://github.com/openai/improved-diffusion 運行代碼會遇到的幾個問題&#xf…

LDR6282-顯示器:從技術革新到視覺盛宴

顯示器&#xff0c;作為我們日常工作和娛樂生活中不可或缺的一部分&#xff0c;承載著將虛擬世界呈現為現實圖像的重要使命。它不僅是我們與電子設備交互的橋梁&#xff0c;更是我們感知信息、享受視覺盛宴的重要窗口。顯示器在各個領域的應用也越來越廣泛。在辦公領域&#xf…

Gradle使用插件SonatypeUploader-v2.6上傳到maven組件到遠程中央倉庫

本文基于sonatypeUploader 2.6版本 插件的使用實例&#xff1a;https://github.com/jeadyx/SonatypeUploaderSample 發布步驟 提前準備好sonatype賬號和signing配置 注&#xff1a;如果沒有&#xff0c;請參考1.0博文的生成步驟&#xff1a; https://jeady.blog.csdn.net/art…

收銀系統源碼-營銷活動-幸運抽獎

1. 功能描述 營運抽獎&#xff1a;智慧新零售收銀系統&#xff0c;線上商城營銷插件&#xff0c;商戶/門店在小程序商城上設置抽獎活動&#xff0c;中獎人員可內定&#xff1b; 2.適用場景 新店開業、門店周年慶、節假日等特定時間促銷&#xff1b;會員拉新&#xff0c;需會…

SQLServer連接異常

2. 文件夾對應的是[internal].[folders]表&#xff0c;與之相關的權限在[internal].[folder_permissions]表 項目對應的是[internal].[projects]表&#xff0c;與之相關的權限在[internal].[project_permissions]&#xff0c;版本在[internal].[object_versions]表。 環境對應…

MongoDB本地配置分片

mongodb server version: 7.0.12 社區版 mongo shell version: 2.2.10 平臺&#xff1a;win10 64位 控制臺&#xff1a;Git Bash 分片相關節點結構示意圖 大概步驟 1. 配置 配置服務器 副本集 &#xff08;最少3個節點&#xff09; -- 創建數據目錄 mkdir -p ~/dbs/confi…

華為eNSP:HCIA匯總實驗

本次拓撲實驗需求&#xff1a; 1、內網地址用DHCP 2、VLAN10不能訪問外網 3、使用靜態NAT 實驗用到的技術有DHCP、劃分VLAN、IP配置、VLAN間的通信&#xff1a;單臂路由、VLANIF&#xff0c;靜態NAT、基本ACL DHCP是一種用于自動分配IP地址和其他網絡參數的協議。 劃分VLA…

新型模型架構(參數化狀態空間模型、狀態空間模型變種)

文章目錄 參數化狀態空間模型狀態空間模型變種Transformer 模型自問世以來,在自然語言處理、計算機視覺等多個領域得到了廣泛應用,并展現出卓越的數據表示與建模能力。然而,Transformer 的自注意力機制在計算每個詞元時都需要利用到序列中所有詞元的信息,這導致計算和存儲復…

Butterfly主題添加動畫加載效果

安裝插件 安裝插件,在博客根目錄[Blogroot]下打開終端&#xff0c;運行以下指令&#xff1a; npm install hexo-butterfly-wowjs --save添加配置 添加配置信息&#xff0c;以下為寫法示例 在站點配置文件_config.yml或者主題配置文件_config.butterfly.yml中添加 wowjs:ena…

簡單介紹 Dagger2 的入門使用

依賴注入 在介紹 Dagger2 這個之前&#xff0c;必須先解釋一下什么是依賴注入&#xff0c;因為這個庫就是用來做依賴注入的。所以這里先簡單用一句話來介紹一下依賴注入&#xff1a; 依賴注入是一種設計模式&#xff0c;它允許對象在運行時注入其依賴項。而不是在編譯時確定&a…

Andorid 11 InputDispatcher FocusedApplication設置過程分析

在Input ANR中&#xff0c;有一類ANR打印的reason 為 “xx does not have a focused window” &#xff0c;表明 輸入事件 5s 內&#xff0c;只有FocusedApplication&#xff0c;而沒找到focused window。本文分析下FocusedApplication的設置過程。 setFocusedApp 源碼路徑&am…