在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ 數(shù)據(jù)選擇
hash表
單詞統(tǒng)計(jì)
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹的保存和加載
圖添加和刪除
排序二叉樹線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹深度遍歷
線性隊(duì)列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹
大數(shù)計(jì)算
二叉樹廣度遍歷
prim算法 下
洗牌算法
圖結(jié)構(gòu)
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫
哈夫曼樹 下
線性堆棧
八皇后
排序二叉樹刪除-1
挑選最大的n個(gè)數(shù)
字符串查找 中篇
哈夫曼樹 上
合并排序
回?cái)?shù)
選擇排序
哈希二叉樹
通用數(shù)據(jù)結(jié)構(gòu)
“數(shù)星星”
單向鏈表
排序二叉樹插入
圖的保存
排序二叉樹刪除-2
排序二叉樹刪除-3
n!中末尾零的個(gè)數(shù)統(tǒng)計(jì)

數(shù)據(jù)選擇

在數(shù)學(xué)中,有一些數(shù)據(jù)選擇的內(nèi)容。舉個(gè)例子來說,有這樣一組數(shù)據(jù):1、2、3、4?,F(xiàn)在我們打算從中挑選出1個(gè)數(shù)據(jù),那么有幾種選擇呢?結(jié)果應(yīng)該是1、2、3、4;那么如果挑選2個(gè)數(shù)據(jù)呢,怎么選呢?那么結(jié)果應(yīng)該是12、13、14、15。以此類推,我們還能挑選出3個(gè)數(shù)據(jù)、4個(gè)數(shù)據(jù)的情況。

那么,在程序上面應(yīng)該怎么表示呢?其實(shí)可以使用遞歸的方法。請(qǐng)大家和我一起計(jì)算一下:

如果需要從1、2、3、4中挑選兩個(gè)數(shù)據(jù),那么是不是先從1開始,然后再2、3、4中挑選一個(gè)數(shù)據(jù),這樣可以有12、13、14三種情況。接著呢,我們從2開始,下面可以選擇的數(shù)據(jù)只有從3、4中選擇了,1不能選擇了,否則會(huì)產(chǎn)生重復(fù)選項(xiàng)。以此類推,那我們從4開始的時(shí)候,發(fā)現(xiàn)4后面沒有數(shù)據(jù)的時(shí)候,此時(shí)迭代終止。

挑選2個(gè)數(shù)據(jù)如此,那么挑選n個(gè)數(shù)據(jù)是不是也是這樣呢?首先選出第1個(gè)數(shù)據(jù),那么剩下來的數(shù)據(jù)只能從這個(gè)數(shù)據(jù)后面位置開始挑選,如果挑選出n-1個(gè)數(shù)據(jù),那么表示n個(gè)數(shù)據(jù)存在,繼續(xù)尋找到,直到n-1個(gè)數(shù)據(jù)選不出來為止;接著我們移動(dòng)第一個(gè)數(shù)據(jù)的位置,同樣需要在當(dāng)前數(shù)據(jù)的后面挑選n-1個(gè)數(shù)據(jù)。以此類推,如果我們發(fā)現(xiàn)當(dāng)前數(shù)據(jù)后面連n-1個(gè)數(shù)據(jù)都沒有了,那么表示遞歸就結(jié)束了。

下面我們就可以書寫代碼了。

a) 定義全局空間和打印函數(shù),保存已經(jīng)遍歷的數(shù)據(jù)

static int gAllData[MAX_NUMBER]= {0};
static int gTotal = 0;

void print(int pData[], int length)
{
    int index;

    for(index = 0; index < length; index++)
        printf("%d", pData[index]);

    printf("n");
}

b)開始數(shù)據(jù)的迭代

void traverse(int pData[], int length, int number)
{
    int index;
    if(0 == length)
        return;

    for(index = 0; index < length; index++){
        gAllData[gTotal ++] = pData[index];

        if(1 == number)
            print(gAllData, gTotal);
        else
            traverse(pData + (index + 1), length - (index + 1), number -1);

        gAllData[-- gTotal] = 0;
    }
}

c)編寫測(cè)試用例,驗(yàn)證結(jié)果

void test()
{
    int data[] = {1, 2, 3, 4, 5, 6};
    memset(gAllData, 0, sizeof(int) * MAX_NUMBER);
    traverse(data, sizeof(data)/sizeof(int), 4);
}

注:我們可以通過不停修改數(shù)組data和數(shù)值number的方法,驗(yàn)證打印出來的數(shù)據(jù)和我們自己計(jì)算的結(jié)果是否有出入。