關於滾動數組的一些菜鳥隨筆

来源:https://www.cnblogs.com/whf10000010/archive/2022/10/11/16739531.html
-Advertisement-
Play Games

什麼是滾動數組 簡單來說,滾動數組就是一種具有短暫記憶力的數組,它會犧牲時間來節省空間,用size=3的數組來“存儲”30000個數據。這麼說有點離譜、抽象,畢竟a[3]怎麼存儲a[30000]裡面的東西呢。這就是滾動數組的特性,即只記錄少量的後續需要使用的數據,而將之前用過且不再需要調用的數據拋棄 ...


什麼是滾動數組

    簡單來說,滾動數組就是一種具有短暫記憶力的數組,它會犧牲時間來節省空間,用size=3的數組來“存儲”30000個數據。這麼說有點離譜、抽象,畢竟a[3]怎麼存儲a[30000]裡面的東西呢。這就是滾動數組的特性,即只記錄少量的後續需要使用的數據,而將之前用過且不再需要調用的數據拋棄、覆蓋,這樣就將a[30000]中不要的數據所占的空間節省出來,以達到a[3]就能達成的任務目標。

滾動數組的核心:取餘

    在開始學習C語音的時候,接觸到了一個新的數學運算符:取餘%,和除號 / 類似的是都多用在特殊的迴圈或者是取一串數字的某一位,除法多取高位,取餘多取低位。在滾動數組中,取餘用於數組下標的動態改變,以達到[3]存[30000]的效果,例如:

int m=30000;//一個原先大的數據空間
int n=3;//所需要的一個滾動數組空間
void fun()
{

    for (int i = 0; i < m; i++)
    {
        d[i % n] = d[(i - 1) % n] + d[(i - 2) % n];
    }
}

    通過取餘的特點可以看出,動態數組在取模和迴圈的作用下只用3個空間就可以做到存儲30000個數據的作用。

使用情況(淺提動態規劃)

  那什麼時候使用呢?

  1. 在不在意時間,只需要節省空間的情況。滾動數組的本質是通過for迴圈多次覆蓋不用的數值,增加了時間,又使用取餘動態改變數組下標,節省了空間。
  2. 多用於動態規劃問題(Dynamic Programing,DP)。  

  在這不得不說到動態規劃問題,但由於篇幅所限,在此僅淺談一下,後續有緣更新。DP主要用於求解以時間劃分階段的動態過程的優化問題,但是一些與時間無關的靜態規劃(如線性規劃、非線性規劃),只要人為地引進時間因素,把它視為多階段決策過程,也可以用動態規劃方法方便地求解。

    多階段決策過程的特點是每個階段都要進行決策,具有n個階段的決策過程的策略是由n個相繼進行的階段決策構成的決策序列。由於前階段的終止狀態又是後一階段的初始狀態,因此確定階段最優決策不能只從本階段的效應出發,必須通盤考慮,整體規劃。就是說,階段k的最優決策不應只是本階段的最優,而必須是本階段及其所有後續階段的總體最優。

   而DP 的有最重要的兩個理論--最優化原理和無後效性原則

例題說明

  斐波那契數列

  1. 因為乘數指定,即只有一條路能走,故符合最優原理。
  2. 乘積固定,沒有其它因素影響,所以符合無後效性原則。

因此可以使用滾動數組方法,代碼:

 1 void func2()
 2 {
 3     int d[3];
 4     d[0] = 1;
 5     d[1] = 1;
 6     for (int i = 0; i < 100; i++)
 7     {
 8         d[i % 3] = d[(i - 1) % 3] + d[(i - 2) % 3];
 9     }
10     printf("%d", d[99 % 3]);
11 }

  01背包

  1. 整體最優是由一步步的子問題最優組成,即n個空間的包最優解是由1~n-1個空間背包的最優解組合而成,故符合最優原理。
  2. 每個數值固定,無論前面問題是怎樣解,後面背包總空間不變,往後的任何決策都不會改變。故符合無後效性。

因此可以使用滾動數組方法,代碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1e3+10;
 4 int t,n,v;
 5 int dp[maxn];
 6 int value[maxn];
 7 int weight[maxn];
 8 int main()
 9 {
10     scanf("%d",&t);
11     while(t--)
12     {
13         memset(dp,0,sizeof dp);
14         scanf("%d %d",&n,&v);
15         for(int i = 1;i <= n;i++)
16             scanf("%d",&value[i]);
17         for(int i = 1;i <= n;i++)
18             scanf("%d",&weight[i]);
19         // for(int i = 1;i <= n;i++)    原始二維dp方程
20         //     for(int j = 0;j <= v;j++)
21         //     {
22         //         if(j >= weight[i])        //若取得下,則可以選擇取或不取
23         //             dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);
24         //         else    
25         //             dp[i][j]=dp[i-1][j];
26         //     }
27         for(int i = 1;i <= n;i++)    //使用滾動數組優化後的dp方程
28             for(int j = v;j >= weight[i];j--)    //倒序保證數據更新的有序性,保證只取一次,正序則是完全背包的寫法
29                 dp[j]=max(dp[j],dp[j - weight[i]] + value[i]);
30         printf("%d\n",dp[v]);
31     }
32     return 0;
33 }

<-------------------------------------------------------------------------------------------->

最後,滾動數組只是動態問題中的一小部分,後續還有更多有趣的知識,例如動態問題和搜索、分治法的聯繫和區別,隨緣更新。By the way,更新這篇時正趕上國慶,擺了幾天,當我正常學習的時候,電腦開擺了,這麼點字,它瘋狂藍屏、黑屏,問題是沒保存,導致寫了好幾次,有些小細節因為寫太多煩了,就沒打,現在反而忘了,華碩天選2,你惡事做盡!!!!

文章部分節選:

動態規劃之滾動數組 - shawchakong - 博客園 (cnblogs.com)

滾動數組(簡單說明)_儒rs的博客-CSDN博客_滾動數組


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在《基於 vite 創建 vue3 項目》一文中整合了 pinia,有不少伙伴不知道 pinia 是什麼,本文簡單介紹 pinia。主要包括三方面: pinia 的基本用法,在《基於 vite 創建 vue3 項目》中 demo 的基礎上簡單重構。 如何持久化 pinia 中的數據,保證瀏覽器刷新時 ...
  • 項目地址 npm庫地址:https://www.npmjs.com/package/dd-ui-library 組件庫:https://github.com/YolandaKisses/ui-library 目錄結構 ├─ src │ └─ components // 存放測試頁面 │ └─ lib ...
  • 微前端概述 微前端概念是從微服務概念擴展而來的,摒棄大型單體方式,將前端整體分解為小而簡單的塊,這些塊可以獨立開發、測試和部署,同時仍然聚合為一個產品出現在客戶面前。可以理解微前端是一種將多個可獨立交付的小型前端應用聚合為一個整體的架構風格。 微前端不是一門具體的技術,而是整合了技術、策略和方法,可 ...
  • 背景 滑鼠拖拽元素移動,算是一個稍微有點點複雜的交互。 而在本文,我們就將打破常規,向大家介紹一種超強的僅僅使用純 CSS 就能夠實現的滑鼠點擊拖拽效果。 在之前的這篇文章中 -- 不可思議的純 CSS 實現滑鼠跟隨,我們介紹了非常多有意思的純 CSS 的滑鼠跟隨效果,像是這樣: 但是,可以看到,上 ...
  • AgileBoot 倉庫 後端地址:https://github.com/valarchie/AgileBoot-Back-End 技術棧:Springboot / Spring Security / MyBatis Plus JPA 無XML/ Druid / Redis / Hutool / J ...
  • 平時聽到一些同學說技術方案沒什麼深度,很難講出來,怎麼去體現技術方案設計的深度是大家普遍關心的一個問題,這個問題不是個例問題,因此分享下自己的一些觀點和看法。主要從三個部分來講: 第一部分主要分析為什麼技術方案沒有體現出深度,找到問題後就好解決,並提出技術方案的廣度和深度特征; 第二部分是技術... ...
  • 本文重點分析介紹在營銷自動化業務中實時營銷場景的背景價值、實時營銷引擎架構以及項目開發過程中如何利用動態隊列做好業務流量隔離,動態發佈,使用規則引擎來提升營銷規則的配置效率等幾種關鍵技術設計實踐。 ...
  • hi,這裡桑小榆。 本篇,我們開始探討微服務架構這塊內容,並打算專門寫一個微服務的專欄。寫微服務的知識體系其實早有動機,把微服務架構知識梳理完整,由於很多因素沒能開展開來,所以一直擱置了。 這次,我繼續持大道至簡的思想,來探討微服務架構的全面內容。儘管我們在實際工作中並沒有用到這塊內容,本職本分或許 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...