ple演算法
⑴ 如何理解mimo系統中的復用增益和編碼增益
2x2MIMO架構,就是mimo技術的疊加技術。mimo技術mimo(multiple-input multiple-output)系統,該技術最早是由marconi於1908年提出的,它利用多天線來抑制信道衰落。根據收發兩端天線數量,相對於普通的siso(single-input single-output)系統,mimo還可以包括simo(single-input multi-ple-output)系統和miso(multiple-input single-output)系統。可以看出,此時的信道容量隨著天線數量的增大而線性增大。也就是說可以利用mimo信道成倍地提高無線信道容量,在不增加帶寬和天線發送功率的情況下,頻譜利用率可以成倍地提高。利用mimo技術可以提高信道的容量,同時也可以提高信道的可靠性,降低誤碼率。前者是利用mimo信道提供的空間復用增益,後者是利用mimo信道提供的空間分集增益。實現空間復用增益的演算法主要有貝爾實驗室的blast演算法、zf演算法、mmse演算法、ml演算法。ml演算法具有很好的解碼性能,但是復雜度比較大,對於實時性要求較高的無線通信不能滿足要求。zf演算法簡單容易實現,但是對信道的信噪比要求較高。性能和復雜度最優的就是blast演算法。該演算法實際上是使用zf演算法加上干擾刪除技術得出的。目前mimo技術領域另一個研究熱點就是空時編碼。常見的空時碼有空時塊碼、空時格碼。空時碼的主要思想是利用空間和時間上的編碼實現一定的空間分集和時間分集,從而降低信道誤碼率。
⑵ 漢諾塔的演算法
演算法介紹:當盤子的個數為n時,移動的次數應等於2^n–1。後來一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操作就可以了。首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子A上,根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放A、B、C;
若n為奇數,按順時針方向依次擺放A、C、B。
所以結果非常簡單,就是按照移動規則向一個方向移動金片:如3階漢諾塔的移動:A→C,A→B,C→B,A→C,B→A,B→C,A→C
漢諾塔問題也是程序設計中的經典遞歸問題。
(2)ple演算法擴展閱讀
由來:
法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟里,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。
不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。
不管這個傳說的可信度有多大,如果考慮一下把64片金片,由一根針上移到另一根針上,並且始終保持上小下大的順序。這需要多少次移動呢?這里需要遞歸的方法。假設有n片,移動次數是f(n).顯然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此後不難證明f(n)=2^n-1。n=64時,
假如每秒鍾一次,共需多長時間呢?一個平年365天有31536000 秒,閏年366天有31622400秒,平均每年31556952秒,計算一下:18446744073709551615秒。
這表明移完這些金片需要5845.54億年以上,而地球存在至今不過45億年,太陽系的預期壽命據說也就是數百億年。真的過了5845.54億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。
⑶ 排序演算法中,in place什麼意思
in place
[英][in pleis][美][ɪn ples]
在對的位置; 適當的; 在工作; 准備就緒;
網路
恰當的; 在適當的位置,適當的; 就地;
雙語例句
1
These were hung in place with extendable rods.
這些已經用伸縮桿掛好。
2
We suspected we were going to be a freemium offering, but we had no pricing structure in place.
我們猜想我們會採用「免費+增值服務」模式,但定價架構還沒有確立。
⑷ 漢諾塔問題演算法
用遞歸實現:
#include <iostream.h>
void Towers(int n, char fromPeg, char auxPeg, char toPeg)
{
if (1 == n) //遞歸出口
{
cout << "Move Disk 1 from Peg " << fromPeg << " to Peg " << toPeg << endl;
return;
}
//把n-1個盤子從fromPeg藉助toPeg移動到auxPeg
Towers(n - 1, fromPeg, toPeg, auxPeg);
//把盤子n由fromPeg直接移動到toPeg
cout << "Move Disk " << n << " from Peg " << fromPeg << " to Peg " << toPeg << endl;
//把n-1個盤子從auxPeg藉助fromPeg移動到toPeg
Towers(n - 1, auxPeg, fromPeg, toPeg);
}
int main()
{
int n = 0;
cout << "Pleae input disk number:";
cin >> n;
Towers(n, 'A', 'B', 'C');
return 0;
}
⑸ 求字元串匹配BM演算法的代碼,要c或者c++的。
BM演算法的C語言實現:
// 函數:int* MakeSkip(char *, int)
// 目的:根據壞字元規則做預處理,建立一張壞字元表
// 參數:
// ptrn => 模式串P
// PLen => 模式串P長度
// 返回:
// int* - 壞字元表
int* MakeSkip(char *ptrn, int pLen)
{
int i;
//為建立壞字元表,申請256個int的空間
//PS:之所以要申請256個,是因為一個字元是8位,
// 所以字元可能有2的8次方即256種不同情況
int *skip = (int*)malloc(256*sizeof(int));
if(skip == NULL)
{
fprintf(stderr, "malloc failed!");
return 0;
}
//初始化壞字元表,256個單元全部初始化為pLen
for(i = 0; i < 256; i++)
{
*(skip+i) = pLen;
}
//給表中需要賦值的單元賦值,不在模式串中出現的字元就不用再賦值了
while(pLen != 0)
{
*(skip+(unsigned char)*ptrn++) = pLen--;
}
return skip;
}
// 函數:int* MakeShift(char *, int)
// 目的:根據好後綴規則做預處理,建立一張好後綴表
// 參數:
// ptrn => 模式串P
// PLen => 模式串P長度
// 返回:
// int* - 好後綴表
int* MakeShift(char* ptrn,int pLen)
{
//為好後綴表申請pLen個int的空間
int *shift = (int*)malloc(pLen*sizeof(int));
int *sptr = shift + pLen - 1;//方便給好後綴表進行賦值的指標
char *pptr = ptrn + pLen - 1;//記錄好後綴表邊界位置的指標
char c;
if(shift == NULL)
{
fprintf(stderr,"malloc failed!");
return 0;
}
c = *(ptrn + pLen - 1);//保存模式串中最後一個字元,因為要反復用到它
*sptr = 1;//以最後一個字元為邊界時,確定移動1的距離
pptr--;//邊界移動到倒數第二個字元(這句是我自己加上去的,因為我總覺得不加上去會有BUG,大家試試「abcdd」的情況,即末尾兩位重復的情況)
while(sptr-- != shift)//該最外層循環完成給好後綴表中每一個單元進行賦值的工作
{
char *p1 = ptrn + pLen - 2, *p2,*p3;
//該do...while循環完成以當前pptr所指的字元為邊界時,要移動的距離
do{
while(p1 >= ptrn && *p1-- != c);//該空循環,尋找與最後一個字元c匹配的字元所指向的位置
p2 = ptrn + pLen - 2;
p3 = p1;
while(p3 >= ptrn && *p3-- == *p2-- && p2 >= pptr);//該空循環,判斷在邊界內字元匹配到了什麼位置
}while(p3 >= ptrn && p2 >= pptr);
*sptr = shift + pLen - sptr + p2 - p3;//保存好後綴表中,以pptr所在字元為邊界時,要移動的位置
// PS:在這里我要聲明一句,*sptr = (shift + pLen - sptr) + p2 - p3;
// 大家看被我用括弧括起來的部分,如果只需要計算字元串移動的距離,那麼括弧中的那部分是不需要的。
// 因為在字元串自左向右做匹配的時候,指標是一直向左移的,這里*sptr保存的內容,實際是指標要移動
// 距離,而不是字元串移動的距離。我想SNORT是出於性能上的考慮,才這么做的。
pptr--;//邊界繼續向前移動
}
return shift;
}
// 函數:int* BMSearch(char *, int , char *, int, int *, int *)
// 目的:判斷文本串T中是否包含模式串P
// 參數:
// buf => 文本串T
// blen => 文本串T長度
// ptrn => 模式串P
// PLen => 模式串P長度
// skip => 壞字元表
// shift => 好後綴表
// 返回:
// int - 1表示成功(文本串包含模式串),0表示失敗(文本串不包含模式串)。
int BMSearch(char *buf, int blen, char *ptrn, int plen, int *skip, int *shift)
{
int b_idx = plen;
if (plen == 0)
return 1;
while (b_idx <= blen)//計算字元串是否匹配到了盡頭
{
int p_idx = plen, skip_stride, shift_stride;
while (buf[--b_idx] == ptrn[--p_idx])//開始匹配
{
if (b_idx < 0)
return 0;
if (p_idx == 0)
{
return 1;
}
}
skip_stride = skip[(unsigned char)buf[b_idx]];//根據壞字元規則計算跳躍的距離
shift_stride = shift[p_idx];//根據好後綴規則計算跳躍的距離
b_idx += (skip_stride > shift_stride) ? skip_stride : shift_stride;//取大者
}
return 0;
}
⑹ 求解不等式數獨演算法,不等式數獨(InequalityNumple)
這個呀,很容易的,尋找突破口呀。比如你觀察一下,有沒有某個格比它周圍的很多格都小,或者都大,一般1跟最大的數就填這兒,然後再推理即可。我每次都是這么乾的,屢試不爽,而且我玩兒的是標準的九宮格。
⑺ BM演算法好後綴問題
BM演算法,是Berlekemp_Massey演算法嗎!?
沒上面那麼費勁吧?
想要的話,明天把我的給你.....
說明我只是為了求出結果,並沒有考慮其它的因素,所以比較簡單
暈,我以為是移位寄存器里的BM演算法....