『算法』讀書筆記 1.4算法分析 Part1

Chapter 1

本章結構

1.1Java語法

1.2數據抽象

1.3集合類抽象數據類型:背包 (Bags) 、隊列 (Queues) 、棧 (Stacks)

1.4算法分析

1.5連通性問題-Case Study: Union - Find ADT

?

本節開篇使用了一個ThreeSum程序進行示例:

ThreeSum所起到的作用為Count the number of triples in a file of N integers that sum to 0,簡單來說,就是從N個數里面取3個數的組合,統計這些組合和為零的數量。

?

public class ThreeSum {public static int count(int[] a){int N = a.length;int cnt = 0;for (int i = 0; i < N; i++)for (int j = i+1; j < N; j++)for (int k = j+1; k < N; k++)if (a[i]+a[j]+a[k] == 0)cnt++;return cnt;}public static void main(String[] args){int[] a = In.readInts(args[0]);StdOut.println(count(a));}
}

?

與此同時,我們需要一個計時器來確定程序運行的時間,書上給出了一種計時器的實現方案,大概就是先在算法程序開始運行前先記錄當前的系統時間,當算法運算完畢后,再次記錄當前的系統時間,然后對兩個時間進行時間差的運算便可得到整個算法所消耗的時間。

?

public class StopWatch {private final long start;public StopWatch(){    start = System.currentTimeMillis();        }public double elapseTime(){    long now = System.currentTimeMillis();return (now - start) / 1000.0;}public static void main(String[] args){int N = Integer.parseInt(args[0]);int[] a = new int[N];for (int i = 0; i < N; i++)a[i] = StdRandom.uniform(-1000000, 1000000);StopWatch timer = new StopWatch();int cnt = ThreeSum.count(a);double time = timer.elapseTime();StdOut.println(cnt + " triples " + time + " seconds ");}
}

?

D.E Knuth認為,一個程序運行的總時間主要和兩點有關:

a.執行每條語句的耗時;

b.執行每條語句的頻率;

如在Threesum.count()中的if語句會執行N(N-1)(N-2)/6次(由排練組合N個選3個可得)

正是這些執行最頻繁的指令決定了程序運行的總時間,而這些指令也被稱為程序的內循環inner loop。許多程序的運行時間往往取決于這一小部分指令的耗時。

ThreeSum運行時間分析

語句塊

運行時間

頻率

總時間

cnt++

t0

取決于輸入x

t0*x

for對k的循環

t1

N取3的組合數

t1*C N 3

for對j的循環

t2

N取2的組合數

t2*C N 2

for對i的循環

t3

N

t3*N

count方法

t4

1

t4

總時間

上述匯總求和

近似

~(t1/6)N^3

增長的數量級

N^3

近似的概念,感覺上類似于微積分里面無窮小,即如果首項目的數量級比其他項大很多,則可以只考慮首項,因為其他冪次較低的項對最終結果的貢獻幾乎無關緊要。

?

至于如何對一些數學模型進行總時間的計算,作者也給了微積分方面的相應解決方案,個人覺得比用數列求和的方式做高級點。

TM截圖20130125153335

事實上,為任何程序建立數學模型從理論上來說都是可行的,只不過有時候處理過程和方法會變得很復雜。

?

?

-----------------------------------------------------------------------------------------------------------------------

小結:

對于大多數程序,得到其運行時間的數學模型的步驟如下:

1.確定輸入模型input model,定義問題的規模。如在ThreeSum中,輸入規模即是標準輸入中大小為N的整型數組a[N]。

2.識別內循環inner loop。對應回ThreeSum的例子,內循環便是三層的for循環。

3.根據內循環中的操作確定成本模型。所謂成本模型,即是算法中的基本操作。如ThreeSum的成本模型則是對數組元素的訪問次數。

4.對于給定的輸入,判斷這些操作的執行效率。

轉載于:https://www.cnblogs.com/viinye/archive/2013/01/25/2876743.html

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

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

相關文章

JS調用MetaMask調用啟動轉賬

1 、代碼必須跑在nginx下&#xff0c;否則沒有eth對象。 2、可以下載ganache來單跑個私服&#xff0c;然后安裝谷歌metamask瀏覽器插件來實驗 3、賬戶1:0xFA387e41FA471172cC729167EBD4862aA7020D91 賬戶2:0x818DF62ff0bE3B28AE8be25e2e848E10138018B7 4、1000000000000000 …

安卓開發工程師面試題!春招我借這份PDF的復習思路,不吃透都對不起自己

寫在前面 身邊有不少去大廠面試的朋友&#xff0c;其中小金面試字節跳動的經歷很有意義&#xff0c;在這里分享給大家。小金是末流211計算機專業大三本科生&#xff0c;前幾天面試了字節跳動的廣州Android開發實習生。下面是他的面試經歷&#xff0c;還有一些他自己的經驗。 …

合算的日本料理

巨鹿路和那個茂名路路口的《和味》&#xff0c;有預訂的話才98一個人&#xff0c;味道不錯&#xff0c;樓上的桃子MM服務狠好&#xff0c;笑容狠甜。那里的東西味道還是狠正宗的&#xff0c;除了一個色拉不對。那里的清酒和梅酒都不錯&#xff0c;尤其梅酒。生牛肉雖然沒有大漁…

安卓開發必須會的技能!淺談Android消息機制原理,威力加強版

目錄 想要成為一名優秀的Android開發&#xff0c;你需要一份完備的知識體系&#xff0c;在這里&#xff0c;讓我們一起成長為自己所想的那樣。 PagerAdapter 介紹ViwePager 緩存策略ViewPager 布局處理ViewPager 事件處理相關內容 Android 基礎 1.Activity 1、 什么是 Activi…

NuGet 無法連接到遠程服務器-解決方法(轉)

原地址&#xff1a; http://www.lixin.me/blog/2012/03/01/29362 今天打開NuGet的Manage NuGet Packages&#xff0c;顯示“無法連接到遠程服務器”。打開Setting-》Package Manager-》Package Sources。看到里面有一個源&#xff1a;https://go.microsoft.com/fwlink/?LinkID…

安卓開發面試書籍,全世界都在問Android開發涼了嗎?建議收藏

前言 本想今年辭掉工作大干一場&#xff0c;沒想到碰到疫情&#xff0c;家里蹲了3個月…&#xff0c;還好字節能給一次機會。前陣子字節跳動的提前批開始了&#xff0c;看宣傳是說有海量HC&#xff0c;機會多多&#xff0c;本著漲漲面經的心理&#xff0c;然后就投遞了一下杭州…

杭州集訓Day5

下面是Day5的題目&#xff01;&#xff08;其實都咕了好幾天了 1007040210. T1 皇后 XY 的疑難 (1s 512MB) 1.1 題目描述有一個n*n的王國城堡地圖上&#xff0c;皇后XY喜歡看騎士之間的戰斗&#xff0c;于是他準備布置m個騎士&#xff0c;其中每一個騎士都可以向8個方向&#x…

安卓開發面試書籍,每個程序員都必須掌握的8種數據結構!面試必會

前言 本篇文章主要記錄分享我的面試準備過程。 很多朋友問我為什么離職 關于離職原因&#xff0c;馬云有一句經典的話“要么錢沒給到位&#xff0c;要么心委屈了”&#xff0c;想必大家耳熟能詳了&#xff0c;我這里再細說一下我個人離職原因&#xff1a; 工資倒掛&#xf…

使用thinkPHP做注冊程序的實例

登錄界面&#xff1a; 數據庫和數據表的結構 具體的操作步驟如下&#xff1a; 第一步&#xff1a;入口文件index.php內容 (此文件基本是屬于固定的格式&#xff09; <?phpdefine(THINK_PATH,./ThinkPHP/);define(APP_NAME,MyApp);define(APP_PAHT,./MyApp/);require_once T…

安卓開發面試技能介紹,來一份全面的面試寶典練練手,不吃透都對不起自己

前言 網上有很多對程序員簡歷的一些指導&#xff0c;這里就不重述&#xff0c;大家可以搜下網上其他大神的總結&#xff0c;結合自身情況修改下。我有幾點建議&#xff1a; 1.盡量不要花哨&#xff0c;程序員和設計師或者產品運營還不一樣&#xff0c;我們的簡歷成功與否決定…

上交所行情文件導入數據庫

事情的起因很簡單&#xff0c;需要將股票收盤行情導入數據庫&#xff0c;因為科創板交易時間延長&#xff0c;需要將原有的程序進行改造&#xff0c;眾所周知&#xff0c;程序員永遠是不夠用的&#xff0c;只能自己解決這個問題。 方式是用定時器調用shell腳本。 上交所的mktdt…

安卓開發面試題及答案,一次嗶哩嗶哩面試經歷,年薪50W

沒有穩定的工作&#xff0c;只有穩定的能力。 又到了萬物復蘇的季節&#xff0c;在程序猿這個行當里&#xff0c;作為 Android 開發出生的&#xff0c;在經歷了八年的脫發生涯后&#xff0c;有了越來越多的想法和感觸 趨勢 隨著各類移動跨平臺的興起&#xff0c;在 ReactNati…

Intent 簡單用法

1.Intent有什么用&#xff1f; Android設計理念是鼓勵減少組件間的耦合&#xff0c;因此Android提供了Intent (意圖) &#xff0c;Intent是一種消息傳遞機制&#xff0c;可以在程序內使用&#xff0c;也可以在程序間使用&#xff0c;主要用于啟動“Activity”“Service”和“廣…

安卓開發面試題!帶著問題深入學習Handler,進階學習資料!

進大廠本來就很難了&#xff0c;不過做足了準備&#xff0c;你會發現很多問題都迎刃而解了&#xff0c;當然有時候運氣也占了一部分&#xff0c;除了運氣以外&#xff0c;當然與我自身的努力也是分不開的。運氣也是實力的一部分&#xff0c;畢竟天助自助者~ 每次到年底做總結的…

VueJS教程3

目錄 13、Vue實例 13.1 動態組件&#xff08;Tab切換、簡化版留言板&#xff09;13.2 使用Vue開發TodoList14、Vue CLI14.1 使用vue-cli開發TodoList接著VueJS教程2。 13、Vue實例 13.1 動態組件&#xff08;Tab切換、簡化版留言板&#xff09; 參考&#xff1a;https://vuejs.…

春招我借這份PDF的復習思路,論程序員成長的正確姿勢

一. 開發背景 想要成為一名優秀的Android開發&#xff0c;你需要一份完備的知識體系&#xff0c;在這里&#xff0c;讓我們一起成長為自己所想的那樣。 面試總結 面試大廠一定要做好充分的準備&#xff0c;沒有準備就去面試完全是去當炮灰的&#xff0c;更是對自己的不負責。再…

T-SQL語句學習(三)

這部分介紹下視圖、索引技術。 1、視圖&#xff1a;是從一個或幾個基本表&#xff08;或視圖&#xff09;導出表。視圖與基本表不同&#xff0c;是一個虛表。 當基本表中的數據發生變化時&#xff0c;從視圖中查詢出來的數據也會隨之改變。 1.1 定義視圖 a、創建視圖的語法要求…

普通二本的辛酸Android面試之路,滿滿干貨指導

一、自我介紹 應該算是起點比較高吧&#xff01;985大學畢業后面一直在國外讀研。之前準備面試微軟但是可能經驗不夠&#xff0c;沒有通過。經過朋友介紹我準備回國&#xff0c;積累一些開發經驗。于是我面試了國內大廠BATJ&#xff0c;還有一些其他比較知名的公司&#xff0c…

python-3.8.0 新特性之賦值表達式

【python-3.8.0 新特性之賦值表達式】 賦值表達式的語法是這樣的“ name : expression ”&#xff0c;形式上看和賦值語句 “ ” 差不多&#xff0c;就作用上來看也雷同。也就是說 “:” 不是必不可少的&#xff0c;它只是一個錦上添花的新語法。 【1、例子】 假設我們要對列表…

普通二本的辛酸Android面試之路,算法太TM重要了

前言 編程是一個江湖&#xff0c;江湖之大&#xff0c;魚龍混雜&#xff0c;一部分江湖人士乃蝦兵蟹將&#xff0c;一不小心就被一箭射死&#xff0c;我們稱之為“碼農”&#xff0c;這些人事江湖的重要組成部分&#xff0c;他們承擔著堆砌代碼&#xff0c;實現功能設計的使命…