玩轉數據結構——均攤復雜度和防止復雜度的震蕩(筆記)

數據規模

這里寫圖片描述

時間復雜度

并不是所有的雙層循環都是O(n^2)的

這里寫圖片描述

復雜度實驗來確定復雜度

這里寫圖片描述

// O(N) 兩倍增加
int findMax( int arr[], int n ){assert( n > 0 );int res = arr[0];for( int i = 1 ; i < n ; i ++ )if( arr[i] > res )res = arr[i];return res;}

這里寫圖片描述

隨后,O(n^2),數據規模乘二,時間復雜度乘4……
隨著數據的增加,可以看到O(logN)
這里寫圖片描述

遞歸算法時間復雜度分析

不是有遞歸的函數就一定是O(nlogn)
深入:主定理
這里寫圖片描述

resize的復雜度分析——均攤復雜度 amortized time complexity

均攤分析和平均情況時間復雜度,前者是一個序列的操作取平均值,后者是針對不同輸入來計算平均值
動態數組(Vector)每一個操作增加一個元素,刪除一個元素相應的復雜度,就需要Amortized Time
動態棧,動態隊列類似(數組)

對于添加操作來說,最壞的情況是addLast(e)的時候,也需要進行resize,那么復雜度就是O(n)級別的了。但是我們忽略了個問題:我們根本不可能每次操作的時候都會觸發resize,因此我們使用最壞的情況分析添加操作的時間復雜度是不合理的
這里寫圖片描述
17次基本操作包含了9次添加操作 + 8次元素轉移操作
平均,每次addLast操作,進行2次基本操作( 17/9 約等于2 )
假設capacity=n,n+1次addLast,觸發resize,總共進行2n+1次基本操作
平均,每次addLast操作,進行2次基本操作( 2n+1/n+1 約等于 2 )
將1次resize的時間平攤給了n+1次addLast的時間,于是得到了平均每次addLast操作進行2次基本操作的結論
這樣均攤計算,時間復雜度是O(1)級別的,這和我們數組中有多少個元素是沒有關系的
在這個例子里,這樣均攤計算,比計算最壞情況是有意義的,這是因為最壞的情況是不會每次都出現的。
關于均攤復雜度,其實在很多算法書中都不會進行介紹,但是在實際工程中,這樣的一個思想是蠻有意義的:就是一個相對比較耗時的操作,如果我們能保證他不會每次都被觸發的話,那么這個相對比較耗時的操作它相應的時間是可以分攤到其它的操作中來的。
同理,我們看removeLast操作,均攤復雜度也為O(1)

resize的復雜度分析——復雜度震蕩
但是,當我們同時看addLast和removeLast操作的時候:
假設我們現在有一個數組,這個數組的容量為n,并且現在也裝滿了元素,那么現在我們再調用一下addLast操作,顯然在添加一個新的元素的時候會需要擴容(擴容會耗費O(N)的時間),之后我們馬上進行removeLast操作(根據我們之前的邏輯,在上一個操作里通過擴容,容量變為了2n,在我們刪除1個元素之后,元素又變為了n = 2n/2,根據我們代碼中的邏輯,會觸發縮容的操作,同樣耗費了O(n)的時間);那么我們如果再addLast、removeLast…等相繼依次操作
這里寫圖片描述
對于addLast和removeLast來說,都是每隔n次操作都會觸發resize,而不會每次都觸發
但是現在我們制造了一種情景:同時看addLast和removeLast的時候,每一次都會耗費O(n)的復雜度,那么這就是復雜度的震蕩
resize的復雜度分析——出現復雜度震蕩的原因及解決方案
removeLast時resize過于著急(采用了Eager的策略: 一旦我們的元素變為當前容積的1/2的時候,我們馬上就把當前的容積也縮容為1/2)
解決方案: Lazy (在線段樹中,也會用到類似的思路)
當元素變為當前容積的1/2時,不著急把當前容積縮容,而是等等;如果后面一直有刪除操作的話,當刪除元素到整個數組容積的1/4時,那么這樣看來我們的數組確實用不了這么大的容積,此時我們再來進行縮容,縮容整個數組的1/2(這樣,即便我們要添加元素,也不需要馬上觸發擴容操作)
當 size == capacity / 4時,才將capacity減半

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

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

相關文章

解決:bash: vim: command not found、docker 容器不識別 vi / vim 、docker 容器中安裝 vim

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 在 Docker 容器中編輯文件&#xff0c;報錯如下&#xff1a; bash: vim: command not found2. 安裝 vim &#xff1a; apt-get in…

路考

路考基本項目組成 路考即是科目三&#xff0c;是新增加的一個考試項目&#xff0c;基本項目有13項&#xff0c;包括上車準備、起步、直線行駛、變更車道、通過路口、靠邊停車、通過人行橫道線、通過學校區域、通過公共汽車站、會車、超車、掉頭、夜間行駛。 上車準備 …

OpenDDS通訊rtps_discovery對等發現模式的pub和sub匹配的日志

OpenDDS的通訊體系中&#xff0c;提供了豐富的日志輸出&#xff0c;通過日志輸出可以清晰的看到pub和sub方的主題匹配的過程&#xff0c;是加深對OpenDDS過程了解的一個好方法。 下面的日志&#xff0c;以OpenDDS3.8為基礎&#xff0c;增加了部分日志和時間戳輸出。 rtps_dis…

Developing Web Applications with Apache, MySQL, memcached, and Perl

Developing Web Applications with Apache, MySQL, memcached, and Perl轉載于:https://www.cnblogs.com/gavinhughhu/archive/2009/11/02/1594290.html

awk 中 {print $1} 什么意思

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 舉個例子 echo "aa bb cc" | awk -F {print $1} 結果就是aa&#xff0c;意思是把字符串按空格分割&#xff0c;取第一個。aw…

有駕照不等于會開車,教你開車技巧27招

當今有車的人真的是越來越多了&#xff0c;不要以為自己有駕照就是會開車了哦&#xff0c;其實開車還是有很多技巧的。下面就跟小編看下學會那些招數才真算會開車吧。 1、上車先看車 上車前繞車轉一圈&#xff0c;看車的外況、輪胎、車底下有沒有漏油漏水。一個星期還得揭開蓋子…

OpenDDS通訊中rtps_discovery對等發現的基本配置和說明

OpenDDS的對等發現模式中&#xff0c;可以采用組播或單播方式進行發現和基于主題的DataReader和DataWriter的匹配&#xff0c;下面是一個簡單的配置樣例&#xff1a; [common] DCPSGlobalTransportConfig$file ORBDebugLevel0 DCPSDebugLevel3 DCPSTransportDebugLevel0 ORBLo…

用戶使用協議

知乎協議&#xff08;草案&#xff09; 歡迎您來到知乎。 請您仔細閱讀以下條款&#xff0c;如果您對本協議的任何條款表示異議&#xff0c;您可以選擇不進入知乎。當您注冊成功&#xff0c;無論是進入知乎&#xff0c;還是在知乎上發布任何內容&#xff08;即「內容」&#xf…

解決: bash: unzip: command not found、linux 安裝 zip 命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 執行解壓命令報錯&#xff1a; bash: unzip: command not found 2. 安裝 zip&#xff1a; yum install -y unzip zip 3. 重試成功…

基于OpenDDS開發發布訂閱HelloMsg程序的過程(Windows)

基于OpenDDS的應用開發&#xff0c;主要分兩個部分的工作&#xff1a; &#xff08;1&#xff09;定義自己的IDL文件&#xff0c;并編譯成消息數據類型通訊動態庫&#xff1b; &#xff08;2&#xff09;分別編寫pub和sub程序&#xff0c;運行 具體步驟&#xff0c;有以下幾…

面試后的總結

面試中的收獲&#xff1a; 優點&#xff1a; 1. 設計用例考慮較為全面。 2. 自動化&#xff0c;性能都有涉獵&#xff0c;但不深入。 3. 對業務理解較深入。 缺點&#xff1a; 1. 接口自動化停留在初級階段。 2. UI自動化了解較少。 3. 性能壓測缺少數據清洗等步驟。 4. 算法還…

怎樣正確使用車燈?

當我們被對面來車明晃晃的遠光燈照得意識模糊時&#xff0c;當你快速接近一輛摩托車卻發現那是一輛壞了一盞尾燈的卡車時&#xff0c;或是當你前方的小車忽然亮起倒車燈卻在往前行駛&#xff0c;最后意識到那只是因為剎車燈與倒車燈線路顛倒時&#xff0c;你就會發現在人們都認…

如何配置DDS以使用多個網絡接口?How do I configure DDS to work with multiple network interfaces?

最近在使用OpenDDS的時候遇到一個問題&#xff1a;存在多個虛擬網卡時&#xff0c;發布&#xff08;訂閱&#xff09;端重新連接時會阻塞幾分鐘&#xff0c;在外網找到一篇與此相關的文章。 You cannot specify which NICs DDS will use to send data. You can restrict the NI…

oracle賦予一個用戶查詢另一個用戶中所有表

說明&#xff1a;讓用戶selame能夠查詢用戶ame中的所有表&#xff08;不能添加和刪除&#xff09;1.創建用戶selamecreate user selame identified by Password;2.設置用戶selame系統權限grant connect,resource to selame; 3.設置用戶selame對象權限 grant select any table t…

使用可靠多播與OPENDDS進行數據分發

介紹 也許應用程序設計人員在創建分布式系統時面臨的最關鍵決策之一是如何在感興趣的各方之間交換數據。通常&#xff0c;這涉及選擇一個或多個通信協議并確定向每個端點分派數據的最有效手段。實現較低級別的通信軟件可能是耗時的&#xff0c;昂貴的并且容易出錯。很多時候&a…

考試 駕校

您的孩子在車里安全么&#xff1f;兒童座椅那點事兒 兒童安全座椅用最最普通的話來解釋就是一種系于汽車座位上,供小童乘坐,有束縛設備,并能在發生車禍時,束縛著小童以保障小童安全的座椅。 兒童安全座椅在歐美發達國家已經得到了普遍使用&#xff0c;這些國家基本上都制定了相…

margin為負值的幾種情況

1、margin-top為負值像素 margin-top為負值像素&#xff0c;偏移值相對于自身&#xff0c;其后元素受影響&#xff0c;見如下代碼&#xff1a; 1 <!DOCTYPE html>2 <html lang"zh">3 <head>4 <meta charset"UTF-8" />5 &l…

事件EVENT,WaitForSingleObject(),WaitForMultipleObjecct()和SignalObjectAndWait() 的使用(上)

用戶模式的線程同步機制效率高&#xff0c;如果需要考慮線程同步問題&#xff0c;應該首先考慮用戶模式的線程同步方法。但是&#xff0c;用戶模式的線程同步有限制&#xff0c;對于多個進程之間的線程同步&#xff0c;用戶模式的線程同步方法無能為力。這時&#xff0c;只能考…

axios 中文文檔、使用說明

以下內容全文轉自 Axios 文檔&#xff1a;https://www.kancloud.cn/yunye/axios/234845 ##Axios Axios 是一個基于 promise 的 HTTP 庫&#xff0c;可以用在瀏覽器和 node.js 中。 Features 從瀏覽器中創建 XMLHttpRequests從 node.js 創建 http 請求支持 Promise API攔截請…

汽車熄火是什么原因?

汽車熄火是什么原因&#xff1f; 近來看見很多車主被車子熄火所困擾&#xff0c;駕校一點通幫助您從以下也許可以找出原因。 1、自動檔車型&#xff1a; 自動檔的車型不會輕易出現熄火的現象&#xff0c;而手動檔的車型由于駕駛水平不高&#xff0c;可能會經常出現熄火的現象。…