當前位置:首頁 » 操作系統 » 前綴和的演算法

前綴和的演算法

發布時間: 2022-11-27 18:23:03

A. 數據結構前綴後綴中綴演算法

前綴:先寫運算符,如a+b,寫成+ab中綴:a+b寫成a+b後綴:a+b寫成ab+

B. 前綴函數

前綴 是指從串首開始到某個位置 結束的一個特殊子串。字元串 的以 結尾的前綴表示為
真前綴 指除了 本身的 的前綴。

後綴 是指從某個位置 開始到整個串末尾結束的一個特殊子串。字元串 的從 開頭的後綴表示為
真後綴 指除了 本身的 的後綴。

給定一個長度為 的字元串 ,其 前綴函數 定義為一個長度為 的數組 。其中 含義為:

對於字元串 和 ,若 對於所有 成立,則稱 是 的 周期

對於字元串 和 ,若 長度為 的前綴和長度為 的後綴相等,就稱 長度為 的前綴(後綴)是 的 border

【注】易知前綴函數 對應的就是字元串 的最長 border 的長度。

根據前綴函數的定義我們可以發現,相鄰的前綴函數值至多增加 1 ,故可以得到字元串 的前綴函數的計算公式:

【注】計算字元串的前綴函數的思想和 KMP 演算法中計算字元串失配數組的思想非常相似。

前綴函數可以用來實現 KMP 演算法,思路為:拼接模式串 和主串 ,得到 , 為不在 和 中出現的字元。設 計算拼接後的字元串 的前綴函數,當出現 時,說明此時模式串匹配上了主串的子串 。

整個演算法時間復雜度為 。

根據上文中給出的性質,可以很容易求出字元串 的字元串周期 & border。假設 ,則可以在 時間內求出 的所有周期 & border。

給定字元串 ,其長度 ,計算 中不同的子串的數目。

【注】從頭部添加、頭部移除或尾部移除後計算不同子串的思想類似。

根據上文的性質可知,如果計算出 的前綴函數之後, 的最小周期為 。由字元串的周期的定義可知,最後字元串 刪去每段周期長度的字元串後,剩餘的最後一段字元串長度不一定是 。故如果 ,則 即是 的長度,否則不存在一個有效的壓縮,即 的長度為 。

C. 請教波蘭表達式前綴表達式的演算法

對於一個前綴表達式的求值而言,首先要從右至左掃描表達式,從右邊第一個字元開始判斷,如果當前字元是數字則一直到數字串的末尾再記錄下來,如果是運算符,則將右邊離得最近的兩個「數字串」作相應的運算,以此作為一個新的「數字串」並記錄下來。一直掃描到表達式的最左端時,最後運算的值也就是表達式的值。例如,前綴表達式「- 1 + 2 3「的求值,掃描到3時,記錄下這個數字串,掃描到2時,記錄下這個數字串,當掃描到+時,將+右移做相鄰兩數字串的運算符,記為2+3,結果為5,記錄下這個新數字串,並繼續向左掃描,掃描到1時,記錄下這個數字串,掃描到-時,將-右移做相鄰兩數字串的運算符,記為1-5,結果為-4,所以表達式的值為-4。

D. 從最大連續和問題看演算法的時間復雜度

參考紫書8.1章節。
最大連續和問題

在給定序列中找到最大連續和,該問題最簡單的解答思路是將所有子序列的和求出,並找到最大值,但如果序列長度較大或序列中元素的值較大,計算需要的時間都將大幅增加。因此需要使用更優化的演算法。以下列舉四種演算法,使用函數maxsum求出最大連續和,數組A存放給定序列,n表示序列長度。

求出所有子序列的和,逐個比較找出最大值,時間復雜度為n^3,當序列長度較長時,運算時間很可能超出要求。

使用前綴和將免去使用循環計運算元序列和的部分,因此時間復雜度減少到n^2,但在n過大時仍然需要較多時間。

將序列劃分為左右兩個區間,並利用遞歸求出左區間,右區間的最大值,利用循環求出合並區間的最大值,最終比較得出結果。對這一題目使用分治法時maxsum函數使用了遞歸和一重循環,最終時間復雜度為nlogn,時間復雜度隨n的增加而增加的幅度更小了。

同樣使用前綴和計運算元序列的和,在前面的解法中,子序列的和=S[j]-S[i-1],只要將最小的S[i-1]記錄下來,就可以直接用S[j]減去最小的S[i-1],得到子序列的最大和,於是又省略了一種循環,時間復雜度被降到n。

若題目范圍中n的可取值較大,我們就不太可能使用前幾種時間復雜度的程序解答,若n的取值較小,則可以使用。

E. 指出BM演算法與KMP演算法的區別

KMP演算法和BM演算法,它們分別是前綴匹配和後綴匹配的經典演算法。
1、因為路由表中的每個表項都指定了一個網路,所以一個目的地址可能與多個表項匹配。最明確的一個表項,即子網掩碼最長的一個,就叫做最長前綴匹配。
2、之所以這樣稱呼它,是因為這個表項也是路由表中,與目的地址的高位匹配得最多的表項。

F. 增1減1運算符,前綴運算和後綴運算請大大們詳細舉例講解,為什麼有變數的值和表達式的值


舉個例子

下面的幾個表達式都在 int i=0 的基礎上運算
1:int j = i++;這里i=0、表達式的值j=1;
2:int j = ++i;這里i=1、表達式的值j=1;
3:int j = i--;這里i=0、表達式的值j=-1;
4:int j = --i;這里i=-1、表達式的值j=-1;

這4個例子你應該能明白一點吧
其實就是兩個重點
1:前綴會在表達式運算前獲得新值、後綴在表達式運算後獲得新值
2:表達式和變數的值是兩個概念,要注意分離

G. Java 前綴和演算法 謝謝

演算法太多了

H. 這個為什麼前綴和後綴演算法都等於8 具體怎麼算的

前綴運算:
÷+*+1*2 4 5 3*1 6
=÷+*+1*2 4 5 3 6
=÷+*+1 8 5 3 6
=÷+*9 5 3 6
=÷+45 3 6
=÷48 6
=8

後綴運算:
1 2 4 *+5*3+1 6*÷
=1 8+5*3+1 6*÷
=9 5*3+1 6*÷
=45 3+1 6*÷
=48 1 6*÷
=48 6÷
=8

I. C語言創建動態數組,計算前綴和數組。 b是數組a的前綴和的數組定義:b[i]=a[0]+a[1]

關於在 C 語言中創建動態數組的問題,可以使用 C 語言提供的庫函數:malloc( ) 來創建動態數組。即可以使用如下代碼進行實現:
#include <stdlib.h> /* 動態分配內存的庫函數 malloc( )、以及後面用到的 free( ) 釋放內存庫函數在此頭文件中有函數原型定義,故必須包含該頭文件 */
#include <stdio.h>
void main( )
{
int num, * p ;

printf("Please input a number :\n" ) ;

scanf("%d", &num) ;

p = (int *)malloc(num) * sizeof(int) ; /* 根據前面從鍵盤上輸入的數字 num,動態分配一個整型動態數組 p */

......
......
free( p ) ; /* 應用程序結束前務必釋放內存 */

}
至於說中間的程序結構的架構,就需要靠自己上機編寫、並親自調試程序了。因為任何一個程序的最終正確運行結果(可以說是100%的程序),都是必須在編程環境下面調試出來的,而不是在紙上寫出來就能夠保證通過的。
在紙上寫出來的部分源代碼,只能夠是給你提供一個大致的編程思路供參考。

熱點內容
小米原生android 發布:2023-02-09 05:12:56 瀏覽:749
android代碼模板 發布:2023-02-09 05:10:18 瀏覽:982
qt編譯oracle 發布:2023-02-09 05:10:13 瀏覽:579
如何暫停伺服器發生錯誤的服務 發布:2023-02-09 05:08:59 瀏覽:446
無線路由登錄密碼怎麼設置 發布:2023-02-09 04:59:05 瀏覽:143
解壓歌曲我要愛你一輩子 發布:2023-02-09 04:57:18 瀏覽:418
安卓版西遊記2如何插卡 發布:2023-02-09 04:56:24 瀏覽:378
什麼情況要配置推車式滅火器 發布:2023-02-09 04:55:30 瀏覽:105
php無法運行 發布:2023-02-09 04:55:27 瀏覽:465
cuda存儲器 發布:2023-02-09 04:53:21 瀏覽:865