當前位置:首頁 » 操作系統 » 高效演算法的奧秘

高效演算法的奧秘

發布時間: 2022-03-13 15:45:14

A. 我想問下Fibonacci數列的下面這段c++高效演算法的理解

(1)只要n+1就夠
(2)memset(t,0,(n+2)*4); 此句將t數值各元素全部清零,x≥2時 t[x]初始值全為0
t[x]!=0 表示已經計算過 ,可直接返回

t[x]==0 表示沒有計算過,需要調遞推過程

(3)本段程序算僅能計算前40個Fibonacci數,因為第40個Fibonacci已超過了C++整數能表示的范圍。

B. 數據結構 設計高效演算法問題

// 要求是刪除順序表中在范圍[x, y]內的元素。
// 按常規思路,每刪除一個順序表元素,則要將其後的元素整體前移一個位置。這種演算法用到了雙重for循環,時間復雜度為O(n^2)。
// 以下的演算法只用到了單重for循環,時間復雜度為O(n)。原理是把所有不在范圍[x, y]內的元素依次保存到順序表的前部,而不處理本來要刪除的、在范圍[x, y]內的元素。當把所有不需要刪除的元素都保存到了順序表前部,只需要重新設置一下順序表的長度為「前部」的最大下標+1,就模擬了刪除操作。

void fun(SqList *&L, ElemType x)
{
// i為循環計數器。
// j為不需要刪除的元素個數,初始化為0。
int i, j = 0;

// 依次遍歷順序表的每個元素
for (i = 0; i < L->length; ++i)
{
// 只處理不需要刪除的元素,即不屬於區間[x, y]的元素
if (!(L->data[i] >= x && L->data[i] <= y))
{
// 每找到一個不需要刪除的元素,就把該元素保存到下標j的位置。
L->data[j] = L->data[i];
// 隨後令j自增1。之前j代表的是處理後的順序表的最大下標,現在j代表的是處理後的順序表的長度。由於下標從0開始,所以長度永遠比最大下標大1。
++j;
}
}

// 設置順序表的長度為j,這樣以後遍歷順序表只能訪問前j個元素。即使下標j之後可能還存在屬於[x, y]的元素,但是不會訪問到它們,自然相當於「刪除」了。
L->length = j;
}

C. 數據結構:設計一個高效演算法,將順序表中的所有元素逆置,要求演算法空間復雜度為O(1)。

設計一個高效演算法,將順序表中的所有元素逆置,要求演算法空間復雜度為O(1)掃描順序表L的前半部分元素L.data[i] (0<=i<L.length/2),將其與後半部分的對應元素L.data[L.length-1-i]進行交換即可。

順序表的存儲只要確定了起始位置,表中任一元素的地址都通過下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤i≤n 其中,L是元素佔用存儲單元的長度。

(3)高效演算法的奧秘擴展閱讀:

數據的物理結構是數據結構在計算機中的表示,它包括數據元素的機內表示和關系的機內表示。由於具體實現的方法有順序、鏈接、索引、散列等多種。

數據元素的機內用二進制位(bit)的位串表示數據元素。當數據元素有若干個數據項組成時,位串中與各個數據項對應的子位串稱為數據域(data field)。

D. 求跳舞毯的高效演算法

#include<iostream>
using namespace std;

long double two[1000],one[1000];

long double SumCount(int a,int b,int n)
{
if(a==b)
{
if(n==0)
return 1;
else if (n==1)
return 0;
else
{
if(two[n-1]==0)
{
two[n-1]=SumCount(a,(a+1)%3,n-1);
}
return 2*two[n-1];
}
}
else
{
if(n==0)
return 0;
else if(n==1 )
return 1;
else
{
if(two[n-1]==0)
two[n-1]=SumCount(a,(3-a-b),n-1);
if(one[n-1]==0)
one[n-1]=SumCount(a,a,n-1);
}
return two[n-1]+one[n-1];
}
}

void main()
{
int n;
re: cout<<"輸入一個正整數:"<<endl;
cin>>n;
if(n<0 || n>1000)
{
cout<<"輸入不合法!"<<endl;
goto re;
}
for(int i=1 ;i<1000;i++)
{
two[i]=0;
one[i]=0;
}

cout<<"路徑個數為:"<<SumCount(0,0,n)<<endl;
}

E. 斐波那契數列任意項 高效演算法的思路是什麼前兩項相加

如果是求第n項斐波那契的話:

時間復雜度為O(1),你說高不高。

F. C語言編程(高效演算法):3的1000次冪

需要用高精度,寫起來會比較繁
至於高效,可以先計算
3^2,3^4,3^8,3^16,3^32,3^64...3^1024
2^1000 = 3^8 * 3^32 * 3^64 * 3^128 * 3^256 * 3^512

G. 高分重賞:求一個高效演算法:已知n個數,取其中的m個數(m<=n),要求:m個數的兩兩間隔大於等於t,

這個給定的n個數的范圍有限制嗎?還有t。如果100個數兩兩之間間隔都大於t的話,一樣會爆啊。。

H. 斐波那契數列任意項 高效演算法的思路是什麼

遞歸速度很慢的原因是:
每個函數佔用一個棧,開辟棧是要時間的。
減少棧的開辟。
少用遞歸演算法。
反其道而為之。

I. 如何設計一個高效演算法,找到第一次重復出現的字元

定義字元串類的映射map類,建立map類對象。通過循環讀入字元串到映射對象,遍歷映射對象的迭代器,統計字元串出現次數,輸出字元串和出現次數。給你個例子吧:

#include <iostream>#include <fstream>#include <map>#include <string>using namespace std ;int main ( int argc, char* argv [ ] ) { typedef map < string , int > WordMap ; // 定義特定的字元串映射類型 typedef WordMap :: iterator wmIter ; // 定義該類型的迭代器 const char* fname = "city.txt" ; // 預設文件名串 if ( argc > 1 ) fname = argv [ 1 ] ; // 讀入命令行的第一個參數,作為文件名路徑串 ifstream in ( fname ) ; // 打開文件輸入流 if ( ! in ) { // 如果打開錯誤,則顯示提示信息後退出 cout << " Open file " << fname << " error ! " << endl ; system("pause"); return 1 ; } WordMap wordmap ; // 定義單詞映射對象 string word ; // 定義單詞字元串對象 while ( in >> word ) wordmap [ word ] ++ ; // 從文件中讀入單詞 // 遍歷容器,顯示輸出計數大於等於2的單詞和計數 for ( wmIter w = wordmap . begin ( ) ; w != wordmap . end ( ) ; w ++ ) if ( w->second >= 2 ) cout << w->first << " : " << w->second << endl ; system("pause"); return 0 ;}

熱點內容
蘋果手機怎麼裝安卓耳機 發布:2024-09-25 03:23:48 瀏覽:741
linuxgcc64位 發布:2024-09-25 03:14:19 瀏覽:742
文件夾恢復軟體免費版 發布:2024-09-25 03:14:14 瀏覽:713
雅閣空調壓縮機多少錢 發布:2024-09-25 03:13:38 瀏覽:22
手機在哪裡找到解鎖密碼 發布:2024-09-25 03:09:21 瀏覽:995
宏被默認腳本 發布:2024-09-25 03:04:27 瀏覽:705
交叉編譯x264 發布:2024-09-25 02:58:59 瀏覽:437
安卓手機cpu關閉後怎麼打開 發布:2024-09-25 02:47:56 瀏覽:33
什麼配置的電子垃圾最好 發布:2024-09-25 02:41:57 瀏覽:526
如何租用雲伺服器挖fil 發布:2024-09-25 02:21:19 瀏覽:614