A. 將長度m和n的有序鏈表合並為一個個新的有序鏈表的演算法的時間復雜度為
您好,你的問題,我之前好像也遇到過,以下是我原來的解決思路和方法,希望能幫助到你,若有錯誤,還望見諒!展開全部
要插入到長度為m的單鏈表,需要找到表尾,這個過程的時間復雜度為o(m),連接的時間復雜度為o(1),所以總的時間復雜度為o(m),所以答案選C。
單鏈表是一種鏈式存取的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素。鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) + 指針(指示後繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。
時間復雜度是同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程序的效率。演算法分析的目的在於選擇合適演算法和改進演算法。
時間復雜度的計算方法:
1、一般情況下,演算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為演算法的漸進時間復雜度,簡稱時間復雜度。
分析:隨著模塊n的增大,演算法執行的時間的增長率和 f(n) 的增長率成正比,所以 f(n) 越小,演算法的時間復雜度越低,演算法的效率越高。
2、在計算時間復雜度的時候,先找出演算法的基本操作,然後根據相應的各語句確定它的執行次數,再找出 T(n) 的同數量級,找出後,f(n) = 該數量級,若 T(n)/f(n) 求極限可得到一常數c,則時間復雜度T(n) = O(f(n))。非常感謝您的耐心觀看,如有幫助請採納,祝生活愉快!謝謝!
B. c語言中鏈表合並怎麼弄詳解
鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。相比於線性表順序結構,操作復雜。
使用鏈表結構可以克服數組鏈表需要預先知道數據大小的缺點,鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。但是鏈表失去了數組隨機讀取的優點,同時鏈表由於增加了結點的指針域,空間開銷比較大。在計算機科學中,鏈表作為一種基礎的數據結構可以用來生成其它類型的數據結構。鏈表通常由一連串節點組成,每個節點包含任意的實例數據(datafields)和一或兩個用來指向上一個/或下一個節點的位置的鏈接("links")。鏈表最明顯的好處就是,常規數組排列關聯項目的方式可能不同於這些數據項目在記憶體或磁碟上順序,數據的存取往往要在不同的排列順序中轉換。而鏈表是一種自我指示數據類型,因為它包含指向另一個相同類型的數據的指針(鏈接)。鏈表允許插入和移除表上任意位置上的節點,但是不允許隨機存取。鏈表有很多種不同的類型:單向鏈表,雙向鏈表以及循環鏈表。
以上是對鏈表的一個概述,說的其實很全面了。我們應用鏈表就是為了克服順序表(數組)必須在內存中連續分配相鄰地址的束縛,更好的應用內存空間(很多破碎不連貫空間)。
你可以把鏈表類比成貨運火車,火車的每一節車皮就是鏈表的每一個結點(一般用link表示),每個結點實際上有兩個部分,一個部分是裝貨的空間就是鏈表的數據存儲部分(一般用link—>data表示),另一部分就是與下一節車廂的連接部分就是鏈表的指針部分(用link—>next表示,指向下一個結點)。那麼我們平時怎樣管理火車呢?記住火車的第一節車皮即可,順著第一節就能找到找到所有的車皮。鏈表也是如此,有了頭結點(一般用head表示)就能找到所有的結點。這里缺點就來了,比如一共100節車皮,我讓你找49節車皮,那你就必須從第一節車皮開始找,否則你沒辦法確定哪個是第49節。鏈表也是如此,必須從頭結點開始找起,這也就是為什麼要記住頭結點的原因之一。相比數組直接按照序號訪問,鏈表的訪問要麻煩很多。同樣我們也需要記住尾結點,就好像我們在一列長火車的尾部插一面小紅旗,那麼列車工人就能方便找到車尾,把需要的車皮掛載到這列火車上;鏈表同樣如此,我們用tail來標記尾結點,直接把需要增加的結點載入到鏈表上即可,否則沒有尾結點,那我們就要從頭開始找到尾,很麻煩啊。
鏈表合並其實很簡單,只要是兩個結點數據類型相同(不同也可以),把其中一個的結點的頭結點連接到另一個的尾結點就可以了。就是讓其中一個的尾結點的指針tail->next=head(另一個結點的頭結點)當然這是無序鏈表。如果是有序鏈表,比如結點數據時按照從大到小排列的,那首先就需要找到插入位置,讀取每一個結點的數據,然後比較。找到插入位置之後按照下圖進行的方式即可:
C. 數據結構C語言單鏈表的創建,插入刪除和合並程序代碼
你看這個應該滿足要求吧。我把三種循環方式都用上了:
#include<stdio.h>
#include<math.h>
int isprime(int n)
{
int i,t;
if(n==2)
return 1;
if(n%2==0 || n<2)
return 0;
for(i=3,t=(int)sqrt(n);i<=t;i+=2)
{
if(n%i==0)
return 0;
}
return 1;
}
void main()
{
int i,a,n;
i=0;
do
{
printf("Input an integer (>=1):");
scanf("%d",&a);
if(a>=1)
break;
}while(++i<3);
if(i==3) exit(0);
printf("prime submultiples:\n");
i=1;
n=0;
while(i<=a)
{
if(a%i==0)
if(isprime(i))
{
printf("%d ",i);
n++;
if(n%10==0)
printf("\n");
}
i++;
}