簡體   English   中英

推導函數的時間復雜度

[英]Deriving time complexity of a function

下面的程序用於搜索正整數的二維正方形數組,其中按非降序對行和列進行排序。 如果目標(值)元素存在於數組中,則程序返回true,否則返回false。 我需要為此任務設計算法,該算法將盡可能高效。 我寫了這段代碼,但是我不知道如何使用求和來得出最壞情況下的運行時復雜度函數。 我假設我的解決方案在最壞的情況下是O(n)階。 但我不知道如何用數學方式顯示(使用求和等)。

撇開實際的代碼來看,最糟糕的情況可能是一個二維數組,其中一個維的大小僅為1,因此就像一個具有100列和1行的數組。 然后,如果要最大數量,則將數組中元素總數的N階移到末尾。

在每次迭代中, x減小或y增大。 在最壞的情況下,直到x == 0y == n-1 ,我們才終止循環。 因此,我們已經從右上角(假設我們從x == n-1y==0 )走到了左下角。

假設數組的大小為n × n ,那么最壞的情況下將需要2n次迭代。 因此,這是最壞的情況O(n)

好吧,我們正在討論上限 (這是O( f (N))的度量),因此我們正在討論最壞的情況。 這意味着遍歷整個數組。

如果我們檢查一下算法,就會發現它遍歷了整個陣列的路徑而沒有回溯: x永遠不會增加, y永遠不會減少,而且我們永遠不會旋轉。 這意味着時間成本在數組維數的總和中為線性:O(N + M)。 對於正方形數組(或其中任何一個維度是另一個維度的固定倍數的任何數組),可以通過恆定因子移除將其簡化為O(N)。

使用匯總顯示它……好吧,在不失去一般性的情況下,您將執行一系列跨步驟的操作,然后執行一系列向下的步驟(或對它們進行一些重新排序),這使您付出了以下代價:

K 跨度 ×N 跨度 + K 向下 ×N 向下 + K 帖子

(這很簡單)。 但是所有這些恆定的K blah位在big-Oh分析中都會丟失,從而為您提供O(N cross + N down ),對於正方形陣列,其簡化為O(2×N)(其他形狀的值略有不同),因此簡化為O (N)。 僅當其中一個維度是另一個維度的超線性函數時,您才能獲得其他成本函數,但這很奇怪。

推導成本函數的關鍵見解是知道您必須遍歷整個數組,但是您只是沿其( 曼哈頓風格 )走過,而不是訪問每個單元。

由於多維數組實際上是一維數組的另一種形式(其中n = x * y),因此其順序為O(n)。 它將搜索的元素總數將少於該數目,但僅是小數。 即使占很大一部分,這也被認為是O(n)。

首先找出最壞的情況。 就像x + y + x或2x + y。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM