【左程云算法03】對數器算法和數據結構大致分類

目錄

對數器的實現

代碼實現與解析

1. 隨機樣本生成器 (randomArray)

2. 核心驅動邏輯 (main?方法)

3. 輔助函數 (copyArray?和?sameArray)

對數器的威力

算法和數據結構簡介?編輯

1. 硬計算類算法 (Hard Computing)

2. 軟計算類算法 (Soft Computing)

核心觀點

一個宏觀的數據結構分類

1. 連續結構 (Continuous Structure)

2. 跳轉結構 (Jumping Structure)


視頻鏈接

算法講解005【入門】對數器-驗證的重要手段

算法講解008【入門】算法和數據結構簡介

對數器的實現

對數器的本質,就是通過大規模的隨機樣本測試,來對比我們實現的“精巧算法”和一個“絕對正確”的暴力方法,從而驗證我們算法的正確性。

構建一個對數器的完整流程分為以下六步:

  1. 你要有一個想測的方法 a(最優解)
    這是我們自己實現的、希望驗證其正確性的算法。

  2. 實現一個復雜度不好但是容易實現的方法 b(暴力解)
    這個方法是我們的“真理標桿”。我們不要求它性能好,但必須保證它的邏輯是絕對正確的。通常,我們會用最直觀、最暴力的方式來實現它。

  3. 實現一個隨機樣本產生器
    我們需要一個函數,能夠生成各種隨機情況的測試數據(例如,長度隨機、值也隨機的數組)。

  4. 把方法 a 和方法 b 跑相同的輸入樣本,看看得到的結果是否一樣
    這是對數器的核心對比環節。對于同一個隨機樣本,分別用方法 a 和方法 b 去處理。

  5. 如果有某個隨機樣本使得比對結果不一致,打印出這個出錯的樣本進行人工干預,改對方法 a 和方法 b
    一旦發現不一致,就意味著我們的方法 a 存在 bug。對數器會自動捕獲這個導致錯誤的“反例”,我們就可以用這個具體的樣本去輕松地進行 debug。

  6. 當樣本數量很多時比對依然正確,可以確定方法 a(最優解)已經正確。
    經過成千上萬,甚至幾十萬次隨機樣本的“轟炸”都未曾出錯,我們就可以非常有信心地認為,我們的算法 a 是正確的。

代碼實現與解析

下面,我們結合截圖中的 Java 代碼,來一步步拆解對數器的具體實現。這里的例子是用來同時驗證我們寫的多個排序算法是否正確。

1. 隨機樣本生成器 (randomArray)

負責源源不斷地提供測試數據。

// 得到一個隨機數組,長度是n
// 數組中每個數,都在1~v之間,隨機得到
public static int[] randomArray(int n, int v) {int[] arr = new int[n];for (int i = 0; i < n; i++) {// Math.random() -> double -> [0,1)的一個小數// Math.random() * v -> double -> [0,v)的一個小數// (int)(Math.random() * v) -> int -> 0 1 2 3 ... v-1,等概率的!// (int)(Math.random() * v) + 1 -> int -> 1 2 3 .... v,等概率的!arr[i] = (int) (Math.random() * v) + 1;}return arr;
}

這個函數接收最大長度?n?和最大值?v,生成一個長度和值都在指定范圍內的隨機數組。注釋清晰地解釋了?Math.random()?如何通過一系列變換,生成我們需要的?[1, v]?范圍內的隨機整數。

2. 核心驅動邏輯 (main?方法)

這里是對數器的“發動機”,它組織了整個測試流程。

// 為了驗證
public static void main(String[] args) {// 隨機數組最大長度int N = 100;// 隨機數組每個值,在1~V之間隨機int V = 1000;// 測試次數int testTimes = 50000;System.out.println("測試開始");for (int i = 0; i < testTimes; i++) {// 隨機得到一個長度,長度在[0~N-1]int n = (int) (Math.random() * N);// 得到隨機數組int[] arr = randomArray(n, V);// 拷貝數組,確保每個排序算法處理的是相同的原始數據int[] arr1 = copyArray(arr);int[] arr2 = copyArray(arr);int[] arr3 = copyArray(arr);// 分別用不同方法排序selectionSort(arr1);bubbleSort(arr2);insertionSort(arr3);// 對比排序結果if (!sameArray(arr1, arr2) || !sameArray(arr1, arr3)) {System.out.println("出錯了!");// 當出錯時,可以把原始樣本arr打印出來,// 方便把這個例子帶入到每個方法去debug!}}System.out.println("測試結束");
}

關鍵點解析

在后續的很多題目中,對數器都會是我們驗證復雜算法(如動態規劃、貪心等)的得力助手。

算法和數據結構簡介

  • 循環測試:通過?testTimes?控制測試次數,量級越大,覆蓋的樣本情況就越全面,結果越可靠。

  • 拷貝數組:copyArray(arr)?這一步至關重要!因為排序是原地操作,會修改原數組。如果不拷貝,那么第一個排序(selectionSort)完成后,arr2?和?arr3?拿到的將是一個有序數組,測試就失去了意義。必須保證每個待測算法都工作在完全相同的、未經修改的原始樣本上。

  • 結果比對:if (!sameArray(arr1, arr2) || !sameArray(arr1, arr3))?負責檢查。這里我們讓多個排序算法互相驗證

    3. 輔助函數 (copyArray?和?sameArray)

    這兩個是保證對數器能正確運行的工具函數。

    copyArray:

    。如果其中任何兩個的結果不一致,就說明至少有一個算法出了問題。

    // 為了驗證
    public static int[] copyArray(int[] arr) {int n = arr.length;int[] ans = new int[n];for (int i = 0; i < n; i++) {ans[i] = arr[i];}return ans;
    }```
    功能很簡單:創建一個和原數組一模一樣的新數組,避免引用傳遞導致的問題。**`sameArray`:**
    ```java
    // 為了驗證
    public static boolean sameArray(int[] arr1, int[] arr2) {// 這里可以先補充長度是否相等的判斷int n = arr1.length;for (int i = 0; i < n; i++) {if (arr1[i] != arr2[i]) {return false;}}return true;
    }

    對數器的威力

    對數器的門檻其實是比較高的,因為它往往需要你用兩種不同的思路去實現相同功能的方法。但它的價值是巨大的:

  • 信心:它是你驗證自己算法正確性的最強后盾。

  • 能力:它鍛煉你從不同角度思考同一個問題的能力(暴力解 vs. 最優解)。

  • 效率:它能自動找到你手動很難想到的邊界“反例”,讓你的 debug 過程從大海撈針變成按圖索驥。

一個有趣、有用的算法分類

首先,左老師提出了一種非官方但極具現實意義的算法分類方法,將算法分為兩大類。

注意:這兩個名詞都不是計算機科學或算法中的標準術語。

1. 硬計算類算法 (Hard Computing)

定義:追求精確解、最優解的算法。

特點:為了找到那個唯一的、精確的答案,可能會導致算法的復雜度較高。

應用場景:這是目前絕大多數程序員面試、筆試、ACM/ICPC 類競賽考察的核心。無論是大廠還是初創公司,面試中考察的算法基本都屬于硬計算的范疇。

重要性硬計算類算法是所有程序員崗位都必須會考、任何寫代碼的工作都會用到的基礎能力。無論是前端、后端、架構,算法的所有崗位都需要用到。

2. 軟計算類算法 (Soft Computing)

核心觀點

任何數據結構都一定是這兩個結構拼出來的!沒有例外!

這是一個非常重要的論斷。我們將來要學習的各種紛繁復雜的數據結構,例如:

等等,無論它們看起來多么復雜,其最底層的實現原理,都離不開“連續的內存”和“跳轉的指針”這兩種基本構造單元的組合與運用。

在后續的課程中,我們將會深入學習這些具體的數據結構,屆時可以回頭再來體會這個宏觀分類的精妙之處。

一個宏觀的數據結構分類

接著,左老師提出了一個同樣宏觀的、用于理解所有數據結構的底層邏輯分類。他認為,無論多么復雜的數據結構,其底層都是由兩種最基本的結構“拼”出來的。

1. 連續結構 (Continuous Structure)

可以理解為像數組這樣的結構。數據在內存中是連續存放的,一個挨著一個,可以通過索引直接計算出內存地址,實現快速的隨機訪問。

2. 跳轉結構 (Jumping Structure)

可以理解為像鏈表這樣的結構。數據在內存中是離散存放的,每個節點通過一個指針或引用,“跳轉”到下一個節點的位置。

  • 定義:更注重逼近一個可接受的解決方案,而不是強求精確的最優解。

  • 特點:計算時間可控,允許在一定程度上犧牲精度來換取效率。

  • 典型例子:模糊邏輯、神經網絡、進化計算、概率論、混沌理論、支持向量機、群體智能等。這些通常是機器學習、人工智能領域的核心算法。

  • 重要性:對于普通的開發崗位,軟計算不是必須掌握的。但對于算法工程師,除了必須精通硬計算類算法之外,還需要掌握軟計算類算法。

  • 鏈表

  • 隊列、棧

  • 樹(二叉樹、平衡樹、B樹等)

  • 可持久化線段樹

  • 樹鏈剖分

  • 后綴數組

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

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

相關文章

MATLAB | 繪圖復刻(二十三)| Nature同款雷達圖

Hello 真的好久不見&#xff0c;這期畫一個Nature同款雷達圖&#xff0c;原圖是下圖中的i圖&#xff0c;長這樣&#xff1a; 本圖出自&#xff1a; Pan, X., Li, X., Dong, L. et al. Tumour vasculature at single-cell resolution. Nature 632, 429–436 (2024). https://d…

React Hooks UseCallback

開發環境&#xff1a;React Native Taro TypescriptuseCallback的用途&#xff0c;主要用于性能優化&#xff1a;1 避免不必要的子組件重渲染&#xff1a;當父組件重渲染時&#xff0c;如果傳遞給子組件的函數每次都是新創建的&#xff0c;即使子組件使用了 React.memo&#…

使用SD為VFX制作貼圖

1.制作遮罩 Gradient Linear 1 通過Blend 可以混合出不同遮罩 2.徑向漸變 Shape 節點 , 非常常用 色階調節灰度和漸變過渡 曲線能更細致調節灰度 色階還可以反向 和圓盤混合 就是 菲涅爾Fresnel 3. 屏幕后處理漸變 第二種方法 4. 極坐標 Gradient Circular Threshold 閾值節…

面經分享二:Kafka、RabbitMQ 、RocketMQ 這三中消息中間件實現原理、區別與適用場景

一、實現原理 (Implementation Principle) 1. Apache Kafka&#xff1a;分布式提交日志 (Distributed Commit Log) Kafka 的核心設計理念是作為一個分布式、高吞吐量的提交日志系統。它不追求消息的復雜路由&#xff0c;而是追求數據的快速、持久化流動。 存儲結構&#xff1a;…

Android開發——初步了解AndroidManifest.xml

Android開發——初步了解AndroidManifest.xml ? AndroidManifest.xml 是 Android 應用的清單文件&#xff0c;包含了應用的包名、組件聲明、權限聲明、API 版本信息等。它是 Android 應用的“說明書”&#xff0c;系統通過它了解應用的結構和行為。咱們的AndroidManifest文件實…

ecplise配置maven插件

1.下載maven 2.配置系統變量 MAVEN_HOME&#xff1a; E:\CODE\MAVEN\apache-maven-3.0.4 3.配置環境變量 %MAVEN_HOME%\bin 4.cmd&#xff1a;mvn -version 注1 如圖所示為&#xff1a;成功 注1&#xff1a;配置成功的前提是要有配置JAVA_HOME,如果沒有配置&#xff0c;則…

Vue 項目性能優化實戰

性能優化有一套「發現 → 定位 → 解決」的閉環方法論。本文以真實項目為藍本&#xff0c;從編碼階段到上線監控&#xff0c;給出一條可落地的 Vue 性能優化路線圖。 一、量化指標定位性能瓶頸 任何優化之前先用量化證據鎖死問題。 Lighthouse 一鍵跑分&#xff1a;首屏、交互、…

阿里云智能多模態大模型崗三面面經

阿里云智能多模態大模型崗三面面經&#xff08;詳細問題感受&#xff09; 最近面試了 阿里云智能集團 - 多模態大模型崗位&#xff0c;三輪技術面&#xff0c;整體體驗還不錯。問題整體偏常規&#xff0c;但對項目的追問比較細致。這里整理一下完整面經&#xff0c;供準備類似崗…

C++ 條件變量 通知 cv.notify_all() 先釋放鎖再通知

簡短的回答是&#xff1a;先釋放鎖&#xff0c;再通知&#xff08;notify_one 或 notify_all&#xff09;通常是更優的選擇。 雖然標準允許兩種順序&#xff0c;但“先解鎖&#xff0c;后通知”的性能通常更好。 下面我們來詳細解釋原因和兩種方式的區別。 先通知&#xff0c;后…

案例精選 | 南京交通職業技術學院安全運營服務建設標桿

導語 隨著教育信息化的深入推進&#xff0c;高校已成為數字化轉型的前沿陣地。然而&#xff0c;伴隨著教學、科研、管理等業務系統的全面上云與互聯互通&#xff0c;高校網絡環境日益復雜&#xff0c;面臨的網絡安全威脅也愈發嚴峻。勒索病毒、數據泄露、APT攻擊等安全事件頻發…

AI安全必修課:模型偏見檢測與緩解實戰

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;AI偏見——看不見的技術債務 2018年&#xff0c…

Trae + MCP : 一鍵生成專業封面

每日一句 人生只有走出來的美麗&#xff0c; 沒有等出來的輝煌。 目錄 每日一句 前言 一.核心工具與優勢解析 二.操作步驟&#xff1a;從配置到生成廣告封面 前期準備&#xff1a;確認環境與工具版本 第一步. 獲取配置代碼 第二步&#xff1a;在 Trae 中導入 MCP 配置…

Eureka與Nacos的區別-服務注冊+配置管理

Eureka與Nacos的區別-服務注冊配置管理 以下是 Eureka 和 Nacos 的核心區別對比&#xff0c;幫你清晰理解它們的不同定位和特性&#xff1a; ?1. 核心定位? ?Eureka&#xff1a;?? ?純服務注冊與發現中心&#xff0c;源自 Netflix&#xff0c;核心功能是維護服務實例清單…

這才是真正懂C/C++的人,寫代碼時怎么區分函數指針和指針函數?

1.介紹 很多初中級開發者常常在這兩個術語之間感到困惑,分不清它們的定義、語法和應用場景,從而在實際編程中埋下隱患。本文旨在撥開迷霧,從概念定義、語法解析、核心區別及實戰應用四個維度,對函數指針與指針函數進行一次全面、深入的辨析,幫助您徹底厘清這兩個概念,并…

Go基礎(④指針)

簡單示例package mainimport "fmt"func main() {var num int 100var p *int &num // 指向int類型的指針fmt.Println(*p) // 解引用&#xff0c;輸出 100*p 200 // 通過指針修改原變量fmt.Println(num) // 輸出 200 }package mainimport "fmt…

java社交小程序源碼支持APP多端springboot部署與功能模塊詳解

構建一個支持 多端訪問、實時互動、商城交易 的綜合型應用&#xff0c;已成為眾多企業和開發團隊的共同目標。由 寵友信息技術有限公司 打造的 友貓社區&#xff0c;正是基于 Spring Boot 技術棧 的全端解決方案&#xff0c;既能支持 微信小程序、APP、PC管理后臺&#xff0c;又…

代理連接性能優化:提升網絡效率的關鍵技術與實踐

在當今數字化時代&#xff0c;代理連接性能優化已成為網絡架構設計中的關鍵環節。本文將深入探討如何通過技術手段提升代理服務器的響應速度、穩定性和資源利用率&#xff0c;幫助讀者構建高效可靠的代理網絡體系。 代理連接性能優化&#xff1a;提升網絡效率的關鍵技術與實踐 …

Rust 元組

簡介 元組可以由多種類型組成&#xff0c;長度固定。 創建元組 // 固定類型 let tup1: (i32, f64, u8) (500, 8.8, 1);// 不固定類型 let tup2 (500.99, 8.8, 1, 9.99);println!("{}", tup2.0);用模式匹配解構元組 let tup (500.99, 8.8, 1, 9.99); let (x, y…

突破閉集限制:3D-MOOD 實現開集單目 3D 檢測新 SOTA

【導讀】 單目 3D 目標檢測是計算機視覺領域的熱門研究方向&#xff0c;但如何在真實復雜場景中識別“未見過”的物體&#xff0c;一直是個難題。本文介紹的 3D-MOOD 框架&#xff0c;首次提出端到端的開集單目 3D 檢測方案&#xff0c;并在多個數據集上刷新了 SOTA。 目錄 …

Python爬蟲數據清洗實戰:從雜亂無章到整潔可用

小伙伴們&#xff0c;做爬蟲最頭疼的不是抓數據&#xff0c;而是抓回來那一堆亂七八糟的內容&#xff01;價格里混著符號、日期格式千奇百怪、還有重復和缺失的值&#xff0c;看著就頭大。別慌&#xff0c;咱們用Python幾招就能搞定。Pandas處理表格數據是真香&#xff0c;正則…