打表法從原理到實戰詳解

打表法結合經典案例從原理到實戰詳解

    • 一、打表法基本信息
      • 1.1 打表法定義
      • 1.2 打表法適用場景
      • 1.3 打表法的優缺點
    • 二、打表法經典案例解析
      • 2.1 快速計算斐波那契數列
        • 2.1.1 問題描述
        • 2.1.2 打表思路
        • 2.1.3 Java代碼實現
        • 2.1.4 復雜度分析
      • 2.2 快速判斷質數(埃氏篩法結合打表)
        • 2.2.1 問題描述
        • 2.2.2 打表思路
        • 2.2.3 Java代碼實現
        • 2.2.4 復雜度分析
      • 2.3 動態規劃問題的打表優化(最長公共子序列)
        • 2.3.1 問題描述
        • 2.3.2 打表思路
        • 2.3.3 Java代碼實現
        • 2.3.4 復雜度分析
    • 三、打表法的優化與注意事項
      • 3.1 優化技巧
      • 3.2 注意事項

打表法是一種實用且高效的優化手段,它通過預先計算并存儲問題的答案,在實際運行時直接查表獲取結果,避免重復計算,從而大幅提升程序運行效率。本文我將結合多個經典案例,深入講解打表法的應用場景、實現方式及優化技巧,幫你掌握這一重要的編碼方法。

一、打表法基本信息

1.1 打表法定義

打表法,顧名思義,就是將問題的答案預先計算出來并存儲在“表”(數組、哈希表等數據結構)中,后續遇到相同問題時,直接從表中讀取答案,無需再次進行復雜計算。這種方法適用于問題的輸入范圍有限、計算過程耗時較長,且答案可以提前計算的場景。

1.2 打表法適用場景

  • 數據范圍固定:輸入數據的范圍較小且確定,例如計算1到10000以內的所有質數、1到100的階乘等。
  • 計算復雜耗時:問題的計算過程復雜,重復計算會消耗大量時間,如一些動態規劃問題、數論問題等。
  • 答案可預先計算:問題的答案可以在程序運行前通過其他方式(如編寫專門的計算程序、數學推導等)計算得出,并且不會隨著程序運行過程而改變。

1.3 打表法的優缺點

  • 優點
    • 提高效率:避免重復計算,顯著減少程序運行時間。
    • 簡化邏輯:在實際使用時,只需查表操作,簡化了程序的運行邏輯。
  • 缺點
    • 占用空間:需要預先存儲答案,可能會占用較多內存空間。
    • 靈活性差:打表結果依賴于預先確定的輸入范圍,若輸入范圍改變,可能需要重新打表。

二、打表法經典案例解析

2.1 快速計算斐波那契數列

2.1.1 問題描述

斐波那契數列是一個經典的數列,其定義為: F ( 0 ) = 0 F(0) = 0 F(0)=0 F ( 1 ) = 1 F(1) = 1 F(1)=1 F ( n ) = F ( n ? 1 ) + F ( n ? 2 ) F(n) = F(n - 1) + F(n - 2) F(n)=F(n?1)+F(n?2) n ≥ 2 n \geq 2 n2)。現在需要快速計算斐波那契數列中第n項的值( 0 ≤ n ≤ 100 0 \leq n \leq 100 0n100)。

2.1.2 打表思路

由于n的范圍較小且確定( 0 ≤ n ≤ 100 0 \leq n \leq 100 0n100),可以預先使用循環計算出斐波那契數列前101項的值,并存儲在數組中。后續需要查詢時,直接從數組中獲取對應項的值。

2.1.3 Java代碼實現
public class FibonacciTable {private static final int[] fibonacciTable;static {fibonacciTable = new int[101];fibonacciTable[0] = 0;fibonacciTable[1] = 1;for (int i = 2; i < 101; i++) {fibonacciTable[i] = fibonacciTable[i - 1] + fibonacciTable[i - 2];}}public static int getFibonacci(int n) {if (n < 0 || n > 100) {throw new IllegalArgumentException("n的范圍應在0到100之間");}return fibonacciTable[n];}public static void main(String[] args) {System.out.println(getFibonacci(10));  // 輸出55}
}
2.1.4 復雜度分析
  • 打表時間復雜度:打表過程通過一次循環計算,時間復雜度為 O ( n ) O(n) O(n),這里n = 101
  • 查詢時間復雜度:查詢時直接從數組中取值,時間復雜度為 O ( 1 ) O(1) O(1)
  • 空間復雜度:使用一個長度為101的數組存儲打表結果,空間復雜度為 O ( n ) O(n) O(n)

2.2 快速判斷質數(埃氏篩法結合打表)

2.2.1 問題描述

給定一個整數n 1 ≤ n ≤ 1000000 1 \leq n \leq 1000000 1n1000000),需要快速判斷它是否為質數。

2.2.2 打表思路

使用埃氏篩法預先計算出1到1000000范圍內的所有質數,并將結果存儲在布爾數組中,true表示對應下標是質數,false表示不是質數。后續判斷某個數是否為質數時,直接從數組中讀取對應位置的值。

2.2.3 Java代碼實現
public class PrimeTable {private static final boolean[] primeTable;static {primeTable = new boolean[1000001];Arrays.fill(primeTable, true);primeTable[0] = primeTable[1] = false;for (int i = 2; i * i <= 1000000; i++) {if (primeTable[i]) {for (int j = i * i; j <= 1000000; j += i) {primeTable[j] = false;}}}}public static boolean isPrime(int n) {if (n < 1 || n > 1000000) {throw new IllegalArgumentException("n的范圍應在1到1000000之間");}return primeTable[n];}public static void main(String[] args) {System.out.println(isPrime(17));  // 輸出trueSystem.out.println(isPrime(18));  // 輸出false}
}
2.2.4 復雜度分析
  • 打表時間復雜度:埃氏篩法打表過程的時間復雜度為 O ( n log ? log ? n ) O(n \log \log n) O(nloglogn),這里n = 1000000
  • 查詢時間復雜度:查詢時直接從數組中取值,時間復雜度為 O ( 1 ) O(1) O(1)
  • 空間復雜度:使用一個長度為1000001的布爾數組存儲打表結果,空間復雜度為 O ( n ) O(n) O(n)

2.3 動態規劃問題的打表優化(最長公共子序列)

2.3.1 問題描述

給定兩個字符串text1text2,返回這兩個字符串的最長公共子序列的長度。例如,輸入text1 = "abcde"text2 = "ace",輸出為3,因為最長公共子序列是"ace"

2.3.2 打表思路

在一些算法競賽或特定場景中,如果已知輸入字符串的長度范圍有限(假設兩個字符串長度都不超過100),可以預先計算出所有可能長度的字符串組合的最長公共子序列長度,并存儲在二維數組中。實際使用時,根據輸入字符串的長度直接從表中獲取結果。

2.3.3 Java代碼實現
public class LCSLookupTable {private static final int[][] lcsTable;static {lcsTable = new int[101][101];for (int i = 1; i < 101; i++) {for (int j = 1; j < 101; j++) {// 這里只是簡單示例初始化,實際計算應使用動態規劃lcsTable[i][j] = 0; }}// 假設這里有一個完整的動態規劃計算過程填充lcsTable,此處省略}public static int longestCommonSubsequence(String text1, String text2) {int m = text1.length();int n = text2.length();if (m > 100 || n > 100) {throw new IllegalArgumentException("字符串長度應不超過100");}return lcsTable[m][n];}public static void main(String[] args) {System.out.println(longestCommonSubsequence("abc", "ac"));  // 假設打表結果正確,輸出2}
}
2.3.4 復雜度分析
  • 打表時間復雜度:如果使用動態規劃計算并填充二維表,時間復雜度為 O ( M × N ) O(M \times N) O(M×N),其中MN分別為預先設定的字符串長度上限(這里M = N = 100) 。
  • 查詢時間復雜度:查詢時直接從二維數組中取值,時間復雜度為 O ( 1 ) O(1) O(1)
  • 空間復雜度:使用一個101×101的二維數組存儲打表結果,空間復雜度為 O ( M × N ) O(M \times N) O(M×N)

三、打表法的優化與注意事項

3.1 優化技巧

  • 壓縮存儲:當打表結果占用空間較大時,可以考慮使用壓縮算法(如位圖、哈希壓縮等)減少存儲空間。例如,在存儲大量布爾值的打表結果時,可使用位圖表示,將多個布爾值存儲在一個字節中。
  • 分塊打表:對于輸入范圍較大的情況,可以采用分塊打表的方式。將輸入范圍劃分為多個小塊,每個小塊單獨打表,查詢時先確定所在塊,再在塊內查詢,既能減少內存占用,又能保持較高的查詢效率。

3.2 注意事項

  • 范圍匹配:確保打表的范圍覆蓋實際使用時的輸入范圍,否則可能會出現越界或無法查詢到結果的情況。
  • 數據更新:如果問題的答案會隨著某些條件改變而變化,打表法可能不適用,或者需要重新打表。
  • 內存限制:在使用打表法時,要注意程序的內存限制,避免因打表占用過多內存導致程序運行出錯。

That’s all, thanks for reading!
覺得有用就點個贊、收進收藏夾吧!關注我,獲取更多干貨~

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

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

相關文章

(LeetCode 面試經典 150 題 )121. 買賣股票的最佳時機 (遍歷)

題目&#xff1a;121. 買賣股票的最佳時機 思路&#xff1a;遍歷&#xff0c;維護已遍歷過的元素中的最小值&#xff0c;時間復雜度0(n)。 C版本&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int mnprices[0];int mx0;for(int i1;i&…

(洛谷)P4447 [AHOI2018初中組] 分組

題目描述 小可可的學校信息組總共有 n 個隊員&#xff0c;每個人都有一個實力值 ai?。現在&#xff0c;一年一度的編程大賽就要到了&#xff0c;小可可的學校獲得了若干個參賽名額&#xff0c;教練決定把學校信息組的 n 個隊員分成若干個小組去參加這場比賽。 但是每個隊員都…

PLA/PHA生物降解化妝品包裝材料的穩定性與貨架期契合性研究

更多案例&#xff1a;https://npmatc.niicapm.com/ 在可持續發展理念的推動下&#xff0c;化妝品行業正經歷一場綠色變革。環保聚合物在包裝領域的應用已成為重要趨勢&#xff0c;這不僅源于消費者對生態友好產品的需求&#xff0c;更基于全球塑料污染治理的緊迫性。化妝品包裝…

STM32[筆記]--4.嵌入式硬件基礎

4.嵌入式硬件基礎 4.1認識上官二號開發板 主控芯片:STM32F103C8T6高速晶振:8M低速晶振:32.768kLED:5顆KEY:3個 主控芯片內部的資源如下項目介紹內核Cortex-M3Flsah64K*8bitSRAM20K*8bitGPIO37個GPIO,分別為PA0-PB15,PC13-PC15,PD0-PD1ADC2個12bitADC合計12了通道,外部通…

【LLaMA-Factory 實戰系列】一、數據準備篇 - 從文本到多模態的完整流程

【LLaMA-Factory 實戰系列】一、數據準備篇 - 從文本到多模態的完整流程 1. 引言2. LLaMA-Factory 數據格式概述2.1 Alpaca 格式2.2 ShareGPT 格式 3. 文本數據準備3.1 Alpaca 格式示例3.2 ShareGPT 格式示例3.3 預訓練數據格式 4. 多模態數據準備4.1 圖像數據準備4.2 視頻數據…

JuiceFS 集群部署詳細指南:使用 SeaweedFS 作為數據存儲,ETCD 作為元數據存儲

1. 概述 本指南將詳細介紹如何部署一個 JuiceFS 集群,其中數據存儲層采用高性能的分布式對象存儲 SeaweedFS,元數據存儲層采用強一致性的分布式鍵值存儲 ETCD。這種組合方案旨在為用戶提供一個高性能、高可用、易于擴展且數據強一致的分布式文件系統解決方案,特別適用于云原…

【數字后端】- 什么是NDR規則?

NDR是指與工藝庫的默認規則&#xff08;DR&#xff09;不同的特殊物理規則&#xff1a; 常見的有&#xff1a; 間距規則&#xff08;spacing&#xff09;&#xff1a;增加信號線與鄰近線之間的距離&#xff0c;降低Crosstalk串擾。線寬規則&#xff08;width&#xff09;&…

B2B 商城定制的優勢:解鎖企業數字化轉型新動力

精準適配業務流程&#xff0c;貼合企業運營特色? 每一家企業都有獨特的業務流程、運營模式與管理需求。標準化的 B2B 商城往往難以完全滿足企業個性化的業務需求&#xff0c;而定制化商城則能夠深入剖析企業業務細節&#xff0c;從采購、銷售、庫存管理到財務管理等全流程&am…

osg實例繪制

#include <osg/Geometry> #include <osg/Geode> #include <osg/Program> #include <osg/VertexAttribDivisor> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <random> // 創建單個立方體幾何體&…

Qt面試題匯總

目錄 1. 簡單說一下Qt 2. 用過QT中的哪些模塊&#xff1f; 3. 說一些你常用的Qt控件&#xff1f; 4. Qt中如何創建一個窗口&#xff1f; 5. 說一下QT中創建控件的方式? 6. 說一下Qt中信號和槽機制是什么&#xff1f; 7. 說一下QT信號與槽機制原理&#xff1f; 8. 如何自…

【stm32】標準庫學習——USART串口

目錄 一、USART串口 1.串口參數及時序 2.USART簡介 3.配置USART基本結構 4.初始化模板 (1) 接收一個數據 (2) 發送一個數據 一、USART串口 1.串口參數及時序 波特率:串口通信的速率起始位:標志一個數據幀的開始&#xff0c;固定為低電平數據位:數據幀的有效載荷&#…

黑馬Day01-03集開始

03集 JSX jsx里面可以寫 表達式,表達式里面會返回一個值js語法的擴展,需要babel解析才能夠在瀏覽器運行 語法 使用花括號 {} ,在里面進行編寫jsx代碼04集 高頻場景 使用引號傳遞字符串 使用js變量 函數調用和方法調用 使用js對象.js自帶的一些對象或new出來的對象{&quo…

vue 路由學習

params 不能傳遞對象類型如 [ ]和{ } query傳參 總結&#xff1a; query傳參既可以通過name 和path 找到路由規則里的組件&#xff0c;所以為了統一避免非必要麻煩 無論是使用query傳參還是 params傳參 映射路由建議統一使用 name 進階 props的使用 備注&#xff1a;資料來自…

JDK安裝全攻略:開啟Java編程大門

目錄 一、安裝前準備1.1 確認系統類型1.2 檢查系統要求1.3 下載 JDK 安裝包 二、Windows 系統下 JDK 安裝步驟2.1 雙擊安裝包2.2 選擇安裝目錄2.3 完成安裝 三、Windows 系統環境變量配置3.1 打開環境變量設置3.2 配置 JAVA_HOME 變量3.3 配置 Path 變量3.4 驗證配置 四、Linux…

《P1253 扶蘇的問題》

題目描述 給定一個長度為 n 的序列 a&#xff0c;要求支持如下三個操作&#xff1a; 給定區間 [l,r]&#xff0c;將區間內每個數都修改為 x。給定區間 [l,r]&#xff0c;將區間內每個數都加上 x。給定區間 [l,r]&#xff0c;求區間內的最大值。 輸入格式 第一行是兩個整數&…

09.【C語言學習筆記】指針(一)

目錄 1. 內存和地址 1.1 內存 1.2 究竟該如何理解編址 2. 指針變量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指針變量和解引用操作符&#xff08;*&#xff09; 2.2.1 指針變量 2.2.2 如何拆解指針類型 2.2.3 解引用操作符 * 2.3 指針變量的大小…

Java中static關鍵字的作用與使用詳解

static是Java中一個非常重要的關鍵字&#xff0c;它可以用來修飾變量、方法、代碼塊和嵌套類。下面將從多個方面詳細解釋static的作用和使用方法。 一、static變量&#xff08;類變量&#xff09; 作用 static變量屬于類&#xff0c;而不是類的某個實例。所有實例共享同一個s…

HMLDM-UD100A 型工業激光測距儀通過modbusRTU 轉 profinet 網關輕松接入到西門子1200plc

HMLDM-UD100A 型工業激光測距儀通過modbusRTU 轉 profinet 網關輕松接入到西門子1200plc 在現代工業生產與自動化控制領域&#xff0c;精準的測量設備與高效的通信技術至關重要。HMLDM-UD100A 型工業激光測距儀憑借其高精度、穩定性強等優勢&#xff0c;廣泛應用于各類工業場景…

數據結構與算法:圖論——深度優先搜索dfs

深度優先搜索dfs 提到深度優先搜索&#xff08;dfs&#xff09;&#xff0c;就不得不說和廣度優先搜索&#xff08;bfs&#xff09;有什么區別 根據搜索方式的不同&#xff0c;可以將圖的遍歷分為「深度優先搜索」和「廣度優先搜索」。 深度優先搜索&#xff1a;從某一頂點出…

數組題解——?合并區間【LeetCode】

56. 合并區間 排序&#xff1a; 將所有區間按起始位置 start 從小到大排序。這樣&#xff0c;重疊的區間會相鄰排列&#xff0c;方便后續合并。 合并&#xff1a; 初始化一個空列表 merged&#xff0c;用于存儲合并后的區間。遍歷排序后的區間列表&#xff1a; 如果 merged 為…