前綴和矩陣

前綴和矩陣(Prefix Sum Matrix)是一種預處理技術,用于快速計算二維矩陣中任意子矩陣的元素和。其核心思想是通過提前計算并存儲每個位置左上角所有元素的和,將子矩陣和的查詢時間從暴力計算的 (O(mn)) 優化到 (O(1))。以下是構建前綴和矩陣的詳細步驟和示例:


文章目錄

      • 1. 定義原矩陣與前綴和矩陣
      • 2. 構建前綴和矩陣的步驟
        • 步驟 1:初始化前綴和矩陣
        • 步驟 2:遞推公式
      • 3. 構建示例
      • 4. 查詢子矩陣和
      • 5. 代碼實現(C++)
      • 關鍵點總結

1. 定義原矩陣與前綴和矩陣

  • 原矩陣:一個 m X n 的二維數組 matrix,元素為整數或浮點數。
  • 前綴和矩陣:一個與 matrix 同尺寸的二維數組 prefix,其中 prefix[i][j] 表示從左上角 (0,0)(i,j) 形成的子矩陣所有元素之和。

2. 構建前綴和矩陣的步驟

步驟 1:初始化前綴和矩陣
  • 創建一個與原矩陣大小相同的二維數組 prefix
  • 通常將 prefix 的索引從 (0,0) 開始(與 matrix 對齊)。
步驟 2:遞推公式
  • 邊界條件

    • i=0j=0 時:

      							prefix[0][0] = matrix[0][0]
      
    • i=0 時(第一行):

      					prefix[0][j] = prefix[0][j-1] + matrix[0][j]
      
    • j=0 時(第一列):

      					prefix[i][0] = prefix[i-1][0] + matrix[i][0]
      
  • 一般情況i>0j>0):

    				prefix[i][j] = matrix[i][j] + prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1]
    

    解釋
    當前元素的值 matrix[i][j],加上上方子矩陣的和 prefix[i-1][j],加上左方子矩陣的和 prefix[i][j-1],再減去重復計算的左上角子矩陣 prefix[i-1][j-1]


3. 構建示例

假設原矩陣 matrix 如下:

                                           [1  2  3][4  5  6][7  8  9]

逐行構建前綴和矩陣 prefix

  1. 初始化 prefix[0][0]

    							prefix[0][0] = matrix[0][0] = 1
    
  2. 第一行(i=0

    					prefix[0][1] &= prefix[0][0] + matrix[0][1] = 1 + 2 = 3 prefix[0][2] &= prefix[0][1] + matrix[0][2] = 3 + 3 = 6 
    
  3. 第一列(j=0

    					prefix[1][0] &= prefix[0][0] + matrix[1][0] = 1 + 4 = 5 prefix[2][0] &= prefix[1][0] + matrix[2][0] = 5 + 7 = 12 
    
  4. 一般位置(i>0j>0

    • prefix[1][1]

      								5 + 5 + 3 - 1 = 12
      
    • prefix[1][2]

      								6 + 12 + 6 - 3 = 21
      
    • prefix[2][1]

      								8 + 12 + 12 - 5 = 27
      
    • prefix[2][2]

      								9 + 27 + 21 - 12 = 45
      

最終前綴和矩陣

                                            [1  3   6 ][5  12  21][12 27  45]

4. 查詢子矩陣和

構建前綴和矩陣后,計算子矩陣 (x1, y1)(x2, y2) 的和公式為:

	Sum = prefix[x2][y2] - prefix[x1-1][y2] - prefix[x2][y1-1] + prefix[x1-1][y1-1]

示例
計算子矩陣 (1,1)(2,2)(即原矩陣中的 5,6,8,9)的和:

	Sum = 45 - 6 - 12 + 1 = 28

5. 代碼實現(C++)

#include <vector>
using namespace std;vector<vector<int>> buildPrefixSum(vector<vector<int>>& matrix) {int m = matrix.size(), n = matrix[0].size();vector<vector<int>> prefix(m, vector<int>(n, 0));// 初始化第一行和第一列prefix[0][0] = matrix[0][0];for (int j = 1; j < n; j++) prefix[0][j] = prefix[0][j-1] + matrix[0][j];for (int i = 1; i < m; i++) prefix[i][0] = prefix[i-1][0] + matrix[i][0];// 填充其他位置for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {prefix[i][j] = matrix[i][j] + prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1];}}return prefix;
}

關鍵點總結

  • 時間復雜度:構建前綴和矩陣需 (O(mn)),查詢子矩陣和僅需 (O(1))。
  • 適用場景:頻繁查詢子矩陣和的場景(如動態規劃、圖像處理)。
  • 邊界處理:注意索引從 0 開始,避免越界訪問。

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

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

相關文章

系統架構評估中的重要概念

(1)敏感點(Sensitivity Point) 和權衡點 (Tradeoff Point)。敏感點和權衡點是關鍵的架構 決策。敏感點是一個或多個構件(和/或構件之間的關系)的特性。研究敏感點可使設計人員 或分析員明確在搞清楚如何實現質量目標時應注意什么。權衡點是影響多個質量屬性的特性&#xff0c; …

SSL證書和HTTPS:全面解析它們的功能與重要性

每當我們在互聯網上輸入個人信息、進行在線交易時&#xff0c;背后是否有一個安全的保障&#xff1f;這時&#xff0c;SSL證書和HTTPS便扮演了至關重要的角色。本文將全面分析SSL證書和HTTPS的含義、功能、重要性以及它們在網絡安全中的作用。 一、SSL證書的定義與基本概念 S…

基于微信小程序的停車場管理系統的設計與實現

第1章 緒論 1.1 課題背景 隨著移動互聯形式的不斷發展&#xff0c;各行各業都在摸索移動互聯對本行業的改變&#xff0c;不斷的嘗試開發出適合于本行業或者本公司的APP。但是這樣一來用戶的手機上就需要安裝各種軟件&#xff0c;但是APP作為一個只為某個公司服務的一個軟件&a…

寶塔找不到php擴展swoole,服務器編譯安裝

1. 在php7.4中安裝swoole&#xff0c;但找不到這個擴展安裝 2. 服務器下載源碼解壓安裝 http://pecl.php.net/package/swoole 下載4.8.0版本 解壓到/www/server/php/74/下 3. 發現報錯問題&#xff1b; 更新一下依賴 yum update yum -y install gcc gcc-c autoconf libjpe…

大數據測試總結

總結測試要點&#xff1a; 參考產品文檔&#xff0c;技術文檔梳理以下內容 需求來源 業務方應用場景 數據源&#xff0c;數據格轉&#xff0c;數據產出&#xff0c;數據呈現方式&#xff08;數據消亡史&#xff09;&#xff0c;數據量級&#xff08;增量&#xff0c;全量&am…

React封裝通用Table組件,支持搜索(多條件)、篩選、自動序號、數據量統計等功能。未采用二次封裝調整靈活,包含使用文檔

封裝通用組件 一、封裝思想二、react代碼三、css代碼四、實現效果五、使用文檔 BasicTableModal 表格模態框組件1.組件簡介2.功能特點3.使用方法基礎用法寬度控制示例帶篩選功能搜索功能示例自定義單元格渲染 4.API 說明PropsColumn 配置項Filter 配置項 5.注意事項 一、封裝思…

React 中 useState 的 基礎使用

概念&#xff1a;useState 是一個React Hook&#xff08;函數&#xff09;&#xff0c;它允許我們向組件添加狀態變量&#xff0c;從而影響組件的渲染結果。 本質&#xff1a;和普通JS變量不同的是&#xff0c;狀態變量一旦發生變化&#xff0c;組件的視圖UI也會跟著變化&…

Html5學習教程,從入門到精通,HTML `<div>` 和 `<span>` 標簽:語法知識點與案例代碼(12)

HTML <div> 和 <span> 標簽&#xff1a;語法知識點與案例代碼 一、語法知識點 1. <div> 標簽 定義: <div> 是一個塊級元素&#xff0c;用于將文檔內容劃分為獨立的、可樣式化的部分。它本身沒有特定的語義&#xff0c;主要用于布局和分組。特點: 塊…

Hbase偽分布安裝教程,詳細版

注意Hbase版本與Hadoop版本的兼容&#xff0c;還有與JDK版本的兼容 本次用到的Hbase為2.4.6版本&#xff0c;Hadoop為3.1.3版本&#xff0c;JDK為JDK8 打開下面的網址查看兼容問題 Apache HBase Reference Guidehttps://hbase.apache.org/book.html#configuration 點擊基礎先…

Python項目】基于Python的圖像去霧算法研究和系統實現

Python項目】基于Python的圖像去霧算法研究和系統實現 技術簡介&#xff1a;采用Python技術、MYSQL數據庫等實現。 系統簡介&#xff1a;圖像去霧系統主要是基于暗通道先驗和逆深度估計技術的去霧算法&#xff0c;系統功能模塊分為&#xff08;1&#xff09;圖像上傳模塊&…

Stable Diffusion Prompt編寫規范詳解

Stable Diffusion Prompt編寫規范詳解 一、語法結構規范 &#xff08;一&#xff09;基礎模板框架 [質量強化] [主體特征] [環境氛圍] [風格控制] [鏡頭參數]質量強化&#xff1a;best quality, ultra detailed, 8k resolution?主體特征&#xff1a;(1girl:1.3), long …

勿以危小而為之勿以避率而不為

《故事匯之&#xff1a;所見/所聞/所歷/所想》&#xff1a;《公園散步與小雨遇記》&#xff08;二&#xff09; 就差一點到山頂了&#xff0c;路上碰到一阿姨&#xff0c;她說等會兒要下大雨了&#xff0c;讓我不要往上走了&#xff0c;我猶豫了一會兒&#xff0c;還是聽勸地返…

wheel_legged_genesis 開源項目復現與問題記錄

Reinforcement learning of wheel-legged robots based on Genesis System Requirements Ubuntu 20.04/22.04/24.04 python > 3.10 開始配置環境&#xff01; 點擊releases后進入&#xff0c;下載對應最新版本的代碼&#xff1a; 將下載后的代碼包解壓到你的自定義路徑下&…

Gin框架從入門到實戰:核心用法與最佳實踐

為什么選擇Gin框架&#xff1f; Gin 是一個基于 Go 語言的高性能 Web 框架&#xff0c;具備以下優勢&#xff1a; 輕量高效&#xff1a;底層依賴 net/http&#xff0c;性能接近原生。簡潔優雅&#xff1a;API 設計友好&#xff0c;支持路由分組、中間件鏈、參數綁定等特性。生…

Leetcode 3468. Find the Number of Copy Arrays

Leetcode 3468. Find the Number of Copy Arrays 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3468. Find the Number of Copy Arrays 1. 解題思路 這一題的話思路上就是一個范圍考察&#xff0c;顯然&#xff0c;對于指定的copy方式&#xff0c;只要我們確定了第一個元素&…

VirtualBox虛擬機MacOS從Big Sur升級到Sequoia(失敗)

VirtualBox虛擬機里安裝好Big Sur版本&#xff0c;嘗試升級到Sequoia&#xff0c;但是最終失敗了。 軟件升級 直接在系統偏好-軟件更新里可以看到提示&#xff0c;提示可以升級到15版本Sequoia 點擊同意&#xff0c;看能不能升級到Sequoia吧。升級前先用時光做了備份。 升級…

[雜學筆記]HTTP1.0和HTTP1.1區別、socket系列接口與TCP協議、傳輸長數據的時候考慮網絡問題、慢查詢如何優化、C++的垃圾回收機制

目錄 1.HTTP1.0和HTTP1.1區別 2.socket系列接口與TCP協議 3.傳輸長數據的時候考慮網絡問題 4.慢查詢如何優化 5.C的垃圾回收機制 1.HTTP1.0和HTTP1.1區別 在連接方式上&#xff0c;HTTP1.0默認采用的是短鏈接的方式&#xff0c;就建立一次通信&#xff0c;也就是說即使在…

ANI AGI ASI的區別

??ANI、?AGI、?ASI的區別主要體現在定義、特點和應用場景上?&#xff1a; 1. ANI&#xff08;狹義人工智能 Artificial narrow intelligence&#xff09;?&#xff1a; ?定義?&#xff1a;ANI&#xff0c;也被稱為弱人工智能&#xff0c;是指專門設計用于執行特定任務…

用OpenCV寫個視頻播放器可還行?(Python版)

引言 提到OpenCV&#xff0c;大家首先想到的可能是圖像處理、目標檢測&#xff0c;但你是否想過——用OpenCV實現一個帶進度條、倍速播放、暫停功能的視頻播放器&#xff1f;本文將通過一個實戰項目&#xff0c;帶你深入掌握OpenCV的視頻處理能力&#xff0c;并解鎖以下功能&a…

leetcode日記(77)子集Ⅱ

不知道為什么看到這道題就很頭痛…… 其實只要掌握nums不包含重復元素的情況下的代碼就行了。 若nums不能包含重復元素&#xff0c;那么使用回溯很容易就能寫出來&#xff1a; class Solution {void hs(vector<int> v,int x,vector<int> r,vector<vector<…