演算法復雜上屆
❶ 如何計算一個演算法的時間復雜度
你這個問題是自己想出來的吧?
第一,你指的時間復雜度是大o表示法的復雜度,也就是一個上界,但不是上確界,所以就算你以一種方式中斷排序過程,時間復雜度還是o(n*logn),假設排序過程還能執行的話。
第二,達到o(n*logn)的排序演算法,以快速排序為例,快速排序不知道你看過沒有,它不像選擇排序或者冒泡排序那樣,每一趟可以確定一直最大或者最小值,對於快速排序,每一趟排序後如果你刪掉最後一個元素將導致整個演算法失效。如果你要用這種刪除元素方法的話,只能採用冒泡排序或者選擇排序,時間復雜度是o(n^2)
所以,我猜想你是不是想做類似於在n個元素中尋找前k個最大者之類的事情(k=n-l)
如果是這樣的話,有復雜度是o(n*logk)的演算法,利用快速排序中的partition操作
經過partition後,pivot左邊的序列sa都大於pivot右邊的序列sb;
如果|sa|==k或者|sa|==k-1,則數組的前k個元素就是最大的前k個元素,演算法終止;
如果|sa|
k,則從sa中尋找前k大的元素。
一次partition(arr,begin,end)操作的復雜度為end-begin,也就是o(n),最壞情況下一次partition操作只找到第1大的那個元素,則需要進行k次partition操作,總的復雜度為o(n*k)。平均情況下每次partition都把序列均分兩半,需要logk次partition操作,總的復雜度為o(n*logk)。
由於k的上界是n,所以以n表示的總復雜度還是o(n*logn)
❷ 世界上最復雜的程序演算法有哪些
Jump-pointer: 在作LA(v,d)的時候, 如果一層一層的往上搜索很慢. 有沒有可能直接跳呢? 比如我們知道LA(u,d) = LA(v,d),如果u是v的一個ancestor. 如果直接儲存了LA(u,d), 並且可以在log(n)的時間"跳"到u, 那麼只要log n的時間就能找到LA(v,d). 這個演算法要用 O(n log n)的preprocess time + O(log n)的time. 每一次跳的距離是上一次的1/2倍.,[這個演算法很簡單的]。
❸ 數據結構:排序演算法總會提到的上界和下界是什麼意思呀
簡單來說,上界就是時間復雜度總不會超過這個數量級,下界就是時間復雜度總不會低於這個數量級。具體去wiki上看下O,Ω,Θ,o,ω的數學定義吧
❹ 演算法中上界和下界分別是指什麼
上界與下界的定義和數學中是相通的,比如一個變數x,並且有x屬於a到b區間,這個區間就表示上界是a,下界是b,對於變數x的取值范圍來說,最大不超過b,最小不小於a。
同樣對於一個演算法,上界就是對於一種資源的限制最大不大於的值,下界就是對於這種資源的限制最小不小於的值。
❺ 如何分析演算法的復雜度
演算法的復雜性
演算法的復雜性是演算法效率度量,是評價演算法優劣的重要依據。一個演算法的復雜性的高低體現在運行該演算法所需要的計算機資源的多少上面,所需的資源越多,我們就說該演算法的復雜性越高;反之,所需的資源越低,則該演算法的復雜性越低。
計算機的資源,最重要的是時間和空間(即存儲器)資源。因而,演算法的復雜性有時間復雜性和空間復雜性之分。
不言而喻,對於任意給定的問題,設計出復雜性盡可能低的演算法是我們在設計演算法時追求的一個重要目標;另一方面,當給定的問題已有多種演算法時,選擇其中復雜性最低者,是我們在選用演算法適應遵循的一個重要准則。因此,演算法的復雜性分析對演算法的設計或選用有著重要的指導意義和實用價值。
簡言之,在演算法學習過程中,我們必須首先學會對演算法的分析,以確定或判斷演算法的優劣。
1.時間復雜性:
例1:設一程序段如下(為討論方便,每行前加一行號)
(1) for i:=1 to n do
(2) for j:=1 to n do
(3) x:=x+1
......
試問在程序運行中各步執行的次數各為多少?
解答:
行號 次數(頻度)
(1) n+1
(2) n*(n+1)
(3) n*n
可見,這段程序總的執行次數是:f(n)=2n2+2n+1。在這里,n可以表示問題的規模,當n趨向無窮大時,如果 f(n)的值很小,則演算法優。作為初學者,我們可以用f(n)的數量級O來粗略地判斷演算法的時間復雜性,如上例中的時間復雜性可粗略地表示為T(n)=O(n2)。
❻ 怎麼求演算法的時間復雜性的上界和下界
簡單一點,忽略諸如程序在循環變數上的開銷,只考慮循環體
復雜度是通過數運算次數直接數出來的,要知道循環多少次,以及每次循環的工作量
(1)循環n次,每次兩步加法兩步賦值,簡單一點講就是每次循環工作量都是常數,所以復雜度就是Θ(n)(既是上界也是下界)
對於(2)而言,n=n-1下降比較慢,n=n/2下降比較快,同樣每次循環的工作量都是常數,只要看循環次數,所以從前者去統計上界,從後者統計下界
最少的情況來自n=2^k的形式,要循環k步,復雜度下界是Ω(log n)
循環次數比較多的情況是反復出現n=n-1運算的情況,但注意一旦執行該運算之後n一定變成偶數,所以最壞情況是n=n-1和n=n/2交替出現,此時循環次數不超過2log_2 n,復雜度上界是O(log n)
合並起來總體的復雜度還是Θ(n)
❼ 求演算法上界的問題
如果有lim(n->∞) T(n)/f(n)=常數C>0,則稱演算法T(n)的時間復雜度為O(f(n))
對於T(n)=2^n+n^2,顯然有lim(n->∞) (2^n+n^2)/(2^n)=1,因此我們說這個演算法的時間復雜度是O(2^n)。
❽ 怎樣通過計算復雜度來估計n的上界。如:T(n)=O(n^3),n的上界是多少
萬有引力定律:
(law of gravitation)物體間相互作用的一條定律,1687年為牛頓所發現。任何物體之間都有相互吸引力,這個力的大小與各個物體的質量成正比例,而與它們之間的距離的平方成反比。如果用m1、m2表示兩個物體的質量,r表示它們間的距離,則物體間相互吸引力為F=(Gm1m2)/r2,G稱為萬有引力常數。
萬有引力定律是牛頓在1687年出版的《自然哲學的數學原理》一書中首先提出的。牛頓利用萬有引力定律不僅說明了行星運動規律,而且還指出木星、土星的衛星圍繞行星也有同樣的運動規律。他認為月球除了受到地球的引力外,還受到太陽的引力,從而解釋了月球運動中早已發現的二均差、出差等。另外,他還解釋了慧星的運動軌道和地球上的潮汐現象。根據萬有引力定律成功地預言並發現了海王星。萬有引力定律出現後,才正式把研究天體的運動建立在力學理論的基礎上,從而創立了天體力學。
簡單的說,質量越大的東西產生的引力越大,地球的質量產生的引力足夠把地球上的東西全部抓牢。
不但地球對它周圍的物體有吸引作用,而且任何兩個物體之間都存在這種吸引作用。物體之間的這種吸引作用普遍存在於宇宙萬物之間,稱為萬有引力。
萬有引力是由於物體具有質量而在物體之間產生的一種相互作用。它的大小和物體的質量以及兩個物體之間的距離有關。物體的質量越大,它們之間的萬有引力就越大;物體之間的距離越遠,它們之間的萬有引力就越小。
兩個可看作質點的物體之間的萬有引力,可以用以下公式計算:F=GmM/r2,即 萬有引力等於重力常量乘以兩物體質量的乘積除以它們距離的平方。其中G代表引力常量,其值約為6.67×10的負11次方單位 N·m2 /kg2。為英國科學家 卡文迪許通過扭秤實驗測得。
兩個通常物體之間的萬有引力極其微小,我們察覺不到它,可以不予考慮。比如,兩個質量都是60千克的人,相距0.5米,他們之間的萬有引力還不足百萬分之一牛頓,而一隻螞蟻拖動細草梗的力竟是這個引力的1000倍!
但是,天體系統中,由於天體的質量和大,萬有引力就起著決定性的作用。在天體中質量還算很小的地球,對其他的物體的萬有引力已經具有巨大的影響,它把人類、大氣和所有地面物體束縛在地球上,它使月球和人造地球衛星繞地球旋轉而不離去。
重力,就是由於地面附近的物體受到地球的萬有引力而產生的。
任意兩個物體或兩個粒子間的與其質量乘積相關的吸引力。自然界中最普遍的力。簡稱引力,有時也稱重力。在粒子物理學中則稱引力相互作用和強力、弱力 、電磁力合稱4種基本相互作用。引力是其中最弱的一種,兩個質子間的萬有引力只有它們間的電磁力的1/1035 ,質子受地球的引力也只有它在一個不強的電場1000伏/米的電磁力的1/1010。因此研究粒子間的作用或粒子 在電子顯微鏡和加速器中運動時,都不考慮萬有引力的作用 。一般物體之間的引力也是很小的,例如兩個直徑為 1米的鐵球 ,緊靠在一起時 , 引力也只有2.83×10-4牛頓,相當於0.03克的一小滴水的重量 。但地球的質量很大,這兩個鐵球分別受到4×104牛頓的地球引力 。所以研究物體在地球引力場中的運動時,通常都不考慮周圍其他物體的引力。天體如太陽和地球的質量都很大,乘積就更大,巨大的引力就能使龐然大物繞太陽轉動。引力就成了支配天體運動的唯一的一種力。恆星的形成,在高溫狀態下不彌散反而逐漸收縮,最後坍縮為白矮星、中子星和黑洞 , 也都是由於引力的作用,因此引力也是促使天體演化的重要因素。
現代天文學理論認為,太陽系是由所謂的原始星雲形成的,原始星雲是一大片十分稀薄的氣體雲,50億年前受某種擾動影響,在引力的作用下向中心收縮。經過漫長時期的演化,中心部分物質的密度越來越大,溫度也越來越高,終於達到可以引發熱核反應的程度,而演變成了太陽。在太陽周圍的殘余氣體則逐漸形成一個旋轉的盤狀氣體層,經過收縮、碰撞、捕獲、積聚等過程,在氣體層中逐步聚集成固體顆粒、微行星、原始行星,最後形成一個個獨立的大行星和小行星等太陽系天體。
太陽系的幾乎所有天體包括小行星都自轉,而且是按照右手定則的規律自轉,所有或者說絕大多數天體的公轉也都是右手定則。為什麼呢?太陽系的前身是一團密雲,受某種力量驅使,使它彼此相吸,這個吸積過程,使密度稀的逐漸變大,這就加速吸積過程。原始太陽星雲中的質點最初處在混沌狀,橫沖直闖,逐漸把無序狀態變成有序狀態,一方面,向心吸積聚變為太陽,另外,就使得這團氣體逐漸向扁平狀發展,發展的過程中,勢能變成動能,最終整個轉起來了。開始轉時,有這么轉的,有那麼轉的,在某一個方向占上風之後,都變成了一個方向,這個方向就是現在發現的右手定則,也許有其他太陽系是左手定則,但在我們這個太陽系是右手定則。地球自轉的能量來源就是由物質勢能最後變成動能所致,最終是地球一方面公轉,一方面自轉。
-------------------------------------
3點一線是為潮汐
潮汐
由於日、月引潮力的作用,使地球的岩石圈、水圈和大氣圈中分別產生的周期性的運動和變化的總稱。固體地球在日、月引潮力作用下引起的彈性—塑性形變,稱固體潮汐,簡稱固體潮或地潮;海水在日、月引潮力作用下引起的海面周期性的升降、漲落與進退,稱海洋潮汐,簡稱海潮;大氣各要素(如氣壓場、大氣風場、地球磁場等)受引潮力的作用而產生的周期性變化(如8、12、24小時)稱大氣潮汐,簡稱氣潮。其中由太陽引起的大氣潮汐稱太陽潮,由月球引起的稱太陰潮。因月球距地球比太陽近,月球與太陽引潮力之比為11:5,對海洋而言,太陰潮比太陽潮顯著。地潮、海潮和氣潮的原動力都是日、月對地球各處引力不同而引起的,三者之間互有影響。大洋底部地殼的彈性—塑性潮汐形變,會引起相應的海潮,即對海潮來說,存在著地潮效應的影響;而海潮引起的海水質量的遷移,改變著地殼所承受的負載,使地殼發生可復的變曲。氣潮在海潮之上,它作用於海面上引起其附加的振動,使海潮的變化更趨復雜。作為完整的潮汐科學,其研究對象應將地潮、海潮和氣潮作為一個統一的整體,但由於海潮現象十分明顯,且與人們的生活、經濟活動、交通運輸等關系密切,因而習慣上將潮汐(tide)一詞狹義理解為海洋潮汐。
❾ 演算法復雜度是什麼概念
同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程序的效率。演算法分析的目的在於選擇合適演算法和改進演算法。一個演算法的評價主要從時間復雜度和空間復雜度來考慮。
1、時間復雜度
(1)時間頻度
一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
(2)時間復雜度
在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間復雜度概念。
一般情況下,演算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為演算法的漸進時間復雜度,簡稱時間復雜度。
在各種不同演算法中,若演算法中語句執行次數為一個常數,則時間復雜度為O(1),另外,在時間頻度不相同時,時間復雜度有可能相同,如T(n)=n2+3n+4與T(n)=4n2+2n+1它們的頻度不同,但時間復雜度相同,都為O(n2)。
按數量級遞增排列,常見的時間復雜度有:
常數階O(1),對數階O(log2n),線性階O(n),
線性對數階O(nlog2n),平方階O(n2),立方階O(n3),...,
k次方階O(nk),指數階O(2n)。隨著問題規模n的不斷增大,上述時間復雜度不斷增大,演算法的執行效率越低。
2、空間復雜度
與時間復雜度類似,空間復雜度是指演算法在計算機內執行時所需存儲空間的度量。記作:
S(n)=O(f(n))
說到底,就是程序執行效率和佔用空間的問題.
❿ 什麼是演算法的復雜性
演算法的復雜性主要包括兩個內容:時間復雜度和空間復雜度;
(1)時間復雜度:表示演算法運行時間的長短,主要和數據的規模、演算法實現的效率有關,一般用O(n)來表示,n表示數據的規模大小。
(2)空間復雜度,主要是指演算法實現所需佔用內存空間的大小,一般用S(n)來表示。