青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

那誰的技術博客

感興趣領域:高性能服務器編程,存儲,算法,Linux內(nèi)核
隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
數(shù)據(jù)加載中……

在一個有序序列中查找重復/不存在的數(shù)

首先說明一下這個問題中提到的"有序序列"的概念.它指的是其中的元素在序列長度范圍之內(nèi),而且是有序(比如升序)排列的序列.比如一個只包含10個元素的數(shù)組, 其中的元素大小在[0, 9]之間,而且是升序排列的.

這兩個問題是二分查找算法的典型應用.

首先來看看查找不存在元素的算法.假設一個元素x不存在, 那么在序列中, 在x位置的元素是x + 1, 以此類推.

初始化 left = 0, right = len - 1 (其中l(wèi)en是這個有序序列的長度, 假設序列從0開始)

當left 
<= right時繼續(xù)循環(huán):
      pos 
= (left + right) / 2
     
      如果 序列的第pos個元素不等于pos
              那么不存在的元素一定出現(xiàn)在pos之前, 將right 
= pos - 1
      否則
              pos之前的元素都是存在的, 因此 left 
= pos + 1

根據(jù)上面的查找原則, 在left之前的元素都是存在的, 返回left

再來看看查找重復元素的算法.假設一個元素x重復出現(xiàn), 那么在序列中, 在x + 1位置的元素是x, 而x+1出現(xiàn)在序列的x+2位置上, 以此類推.
從上面的算法可以看出, 最后返回的位置, 在它之前的元素位置都是正確的, 就是說,出現(xiàn)在了它們應該出現(xiàn)的位置, 因此, 上面算法也依然可以用于這個問題上面, 只要把上面算法的返回值 - 1即可以得到本算法要求的返回值.

關于這個問題,我之前有過類似問題的討論:
1) 二分查找算法(迭代和遞歸版本)
2) 求出不在里面的數(shù)來
這個問題的討論也是對<<編程珠璣>>第二章第一個算法問題的補充.

C代碼如下:
/*
 * 查找有序序列中 重復/不存在 的數(shù)算法演示
 * 版權所有:
http://m.shnenglu.com/converse/
 
*/

#include 
<stdio.h>
#include 
<stdlib.h>
#include 
<time.h>

#define FUNC_IN()   printf("\nin  %s\n\n", __FUNCTION__)
#define FUNC_OUT()  printf("\nout %s\n\n", __FUNCTION__)

/* 生成一個長度為len的數(shù)組, 其中array[i] = i(0<=i<len) */
void generate_array(int array[], int len);
    
/* 向長度為len的有序數(shù)組中新增一個元素x(0<=x<len - 1), 同時保持原有數(shù)組有序 */
void add_to_array(int array[], int len, int x);

/* 刪除長度為len的有序數(shù)組中的一個元素x(0<=x<len), 同時保存原有數(shù)組有序 */
void del_from_array(int array[], int len, int x);

/* 打印一個數(shù)組 */
void display_array(int array[], int len);

/* 查找一個長度為len的有序數(shù)組中哪個元素不存在 */
int find_not_exist(int array[], int len);

/* 查找一個長度為len的有序數(shù)組中哪個元素重復了 */
int find_duplicate(int array[], int len);

int main(int argc, char *argv[])
{
    
int count = 10;
    
int *array = NULL;

    srand(time(NULL));

    
if (argc == 2)
    {
        count 
= atoi(argv[1]);
    }

    
/* 申請內(nèi)存的時候多申請一個元素 */
    
if ((array = (int *)malloc((count + 1* sizeof(int))) == NULL)
    {
        printf(
"malloc error!\n");
        exit(
-1);
    }

    
/* 首先生成一個元素都是有序的整型數(shù)組 */
    generate_array(array, count);

    display_array(array, count);

    
/* 刪除其中的一個元素 */
    del_from_array(array, count, rand() 
% count);

    display_array(array, count);

    
/* 查找不存在的元素 */
    
int x = find_not_exist(array, count);
    printf(
"the element not exist is %d\n", x);

    
/* 把刪除的元素補上 */
    add_to_array(array, count 
+ 1, x);

    
/* 新增一個重復的元素 */
    add_to_array(array, count 
+ 1, rand() % count);

    display_array(array, count 
+ 1);

    
/* 查找重復的元素 */
    printf(
"the element duplicate is %d\n", find_duplicate(array, count + 1));

    free(array);

    
return 0;
}

void generate_array(int array[], int len)
{
    
int i;

    
for (i = 0; i < len; ++i)
    {
        array[i] 
= i;
    }
}

void add_to_array(int array[], int len, int x)
{
    
int i;

    
/* 把[x + 1, len - 1]之間的元素右移一個位置 */
    
for (i = x + 1; i < len - 1++i)
    {
        array[i 
+ 1= i;
    }

    
/* x + 1的位置保存重復的x, 這樣數(shù)組仍然是有序的 */
    array[x 
+ 1= x;
}

void del_from_array(int array[], int len, int x)
{
    
int i;

    
/* 將[x, len)的元素向左移動一個位置 */
    
for (i = x; i < len; ++i)
    {
        array[i] 
= i + 1;
    }

    printf(
"del_from_array element is %d\n", x);
}

void display_array(int array[], int len)
{
    
int i;

    printf(
"\n{ ");
    
for (i = 0; i < len; ++i)
    {
        printf(
"%d ", array[i]);
    }

    printf(
"}\n");
}

int find_not_exist(int array[], int len)
{
    FUNC_IN();

    
int left, right, pos, count;

    
for (left = 0, right = len - 1, count = 1; left <= right; count++)
    {
        pos 
= (left + right) / 2;

        printf(
"[%d] left = %d, pos = %d, right = %d\n", count, left, pos, right);

        
/*
         * 如果array[pos] != pos, 那么不存在的元素一定在[left, pos - 1]之間
         
*/
        
if (array[pos] != pos)
        {
            right 
= pos - 1;
        }
        
else
        {
            left 
= pos + 1;
        }
    }

    FUNC_OUT();

    
/* left之前的元素都是存在的 */
    
return left;
}

int find_duplicate(int array[], int len)
{
    
/*
     * find_not_exist()函數(shù)的返回值表示在它之前的元素都是正確的, 
     * 因此這個返回位置就是有重復的元素位置 + 1, 于是要減去1
     * 
*/
    
return find_not_exist(array, len) - 1;
}





posted on 2009-08-23 20:24 那誰 閱讀(4863) 評論(3)  編輯 收藏 引用 所屬分類: 算法與數(shù)據(jù)結構

評論

# re: 在一個有序序列中查找重復/不存在的數(shù)  回復  更多評論   

為什么不用BitArray?
遍歷一次就搞定!
2009-08-24 12:20 | 阿福

# re: 在一個有序序列中查找重復/不存在的數(shù)  回復  更多評論   

@阿福
別人是搞算法的...
用容器只是應用
2009-08-24 16:09 | Norz

# re: 在一個有序序列中查找重復/不存在的數(shù)  回復  更多評論   

@阿福
你可能沒有仔細看我對問題的描述,事實上,如果使用這里所用的二分查找算法,都不用遍歷一次,O(log(n))的時間復雜度就搞定問題了.
2009-08-24 16:23 | 那誰
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久亚洲综合| 亚欧成人在线| 国产精品久久久久秋霞鲁丝| 久久久久久亚洲精品中文字幕| 午夜欧美大片免费观看| 亚欧成人精品| 久久婷婷综合激情| 欧美大片免费久久精品三p| 欧美电影免费观看高清完整版| 欧美区日韩区| 国产精品日韩欧美一区二区三区| 国产精品尤物| 亚洲国产美女久久久久| 久久激情五月丁香伊人| 久久九九国产精品| 欧美激情综合在线| 国产毛片精品国产一区二区三区| 国产一区二区三区久久| 亚洲精品在线电影| 久久国产精彩视频| 亚洲国产精品久久| 亚洲二区视频在线| 亚洲特色特黄| 久久精品五月| 欧美日韩精品综合| 韩国v欧美v日本v亚洲v| 一本色道久久加勒比88综合| 欧美在线观看视频| 亚洲黄网站黄| 欧美一区二区黄| 欧美精品日韩一本| 国语自产在线不卡| 亚洲色在线视频| 免费在线欧美视频| 亚洲欧美激情诱惑| 欧美日韩精品免费观看视频完整| 国色天香一区二区| 欧美一区二区三区免费观看| 最新国产拍偷乱拍精品| 久久精品五月| 国产欧美一区视频| 亚洲视频在线一区| 亚洲国产成人av在线| 欧美一区二区三区电影在线观看| 欧美日韩精品免费观看视一区二区 | 一区二区三区国产精华| 久久综合伊人77777尤物| 国产精品婷婷| 亚洲一区二区在线免费观看| 欧美成人dvd在线视频| 欧美一区不卡| 国产欧美日韩一区二区三区在线观看| av成人国产| 亚洲日本成人| 欧美国产日韩一区二区| 亚洲国产欧美日韩| 欧美国产激情| 老牛国产精品一区的观看方式| 韩国精品主播一区二区在线观看| 欧美中文字幕在线视频| 亚洲欧美日韩综合| 国产亚洲精品自拍| 久久视频国产精品免费视频在线| 亚洲欧美国产三级| 国产视频在线观看一区二区三区| 香蕉成人伊视频在线观看| 中文日韩电影网站| 午夜精品久久久久久99热软件| 欧美日韩免费一区二区三区视频| 亚洲国产精品久久精品怡红院| 欧美大片在线观看一区二区| 免费看亚洲片| 99精品久久久| 在线中文字幕日韩| 国产精品一区视频网站| 久久久不卡网国产精品一区| 久久久久久网| 日韩午夜激情| 亚洲综合成人在线| 狠狠网亚洲精品| 欧美激情影院| 国产精品h在线观看| 亚洲欧美在线播放| 久久精品成人| 日韩亚洲国产欧美| 亚洲视频你懂的| 韩国av一区二区三区在线观看| 欧美freesex8一10精品| 欧美日韩精品不卡| 久久精品成人| 欧美成人第一页| 亚洲欧美伊人| 欧美a级在线| 午夜精品婷婷| 欧美91视频| 久久福利影视| 欧美精品久久久久久久免费观看| 午夜精品福利一区二区三区av| 欧美在线观看一区| avtt综合网| 欧美有码视频| 一区二区欧美亚洲| 久久久另类综合| 亚洲一区二区在| 每日更新成人在线视频| 香蕉av777xxx色综合一区| 女主播福利一区| 欧美一区二区三区视频在线| 久久一区欧美| 欧美亚洲在线视频| 欧美日韩国产综合新一区| 久久人人爽国产| 国产精品视频专区| 亚洲激情偷拍| 亚洲国产岛国毛片在线| 亚洲欧美精品中文字幕在线| 日韩一级裸体免费视频| 久久亚洲综合| 久久亚洲美女| 国产亚洲综合性久久久影院| 一区二区成人精品| 亚洲最新合集| 欧美成人精品在线视频| 久久综合给合久久狠狠色 | 欧美精品在欧美一区二区少妇| 久久综合一区二区| 国产精品一卡| 亚洲综合色丁香婷婷六月图片| 99视频精品| 欧美精品尤物在线| 91久久久久| 欧美午夜电影完整版| 欧美高清hd18日本| 好吊日精品视频| 欧美在线免费视屏| 久久精品国产99精品国产亚洲性色 | 久久久噜噜噜久久中文字免| 国产精品视频最多的网站| 亚洲深夜av| 亚洲欧美日韩国产综合在线 | 国产精品国色综合久久| 日韩天堂av| 亚洲午夜影视影院在线观看| 欧美日韩亚洲成人| 一本久久a久久免费精品不卡| 一本一道久久综合狠狠老精东影业| 欧美激情一级片一区二区| 亚洲黄色av| 亚洲午夜羞羞片| 国产欧美日韩在线视频| 午夜精品久久久久久久99水蜜桃| 久久se精品一区精品二区| 国产日韩欧美麻豆| 久久久久综合一区二区三区| 欧美福利网址| 亚洲视频精品| 国产欧美一区二区白浆黑人| 久久精品日产第一区二区三区| 玖玖在线精品| 洋洋av久久久久久久一区| 欧美三级视频在线观看| 亚洲欧美视频在线观看| 裸体丰满少妇做受久久99精品| 91久久国产精品91久久性色| 欧美—级a级欧美特级ar全黄| 亚洲一区二区三区精品在线| 久久久久久亚洲综合影院红桃| 亚洲国产影院| 欧美连裤袜在线视频| 亚洲一区二区三区视频播放| 美女国产一区| 亚洲午夜伦理| 国产欧美日韩高清| 免费观看成人网| 亚洲一品av免费观看| 免费久久99精品国产自| 亚洲免费在线观看视频| 在线观看日韩av先锋影音电影院| 欧美日韩久久精品| 久久免费视频观看| 亚洲午夜激情| 亚洲国产精品福利| 久久久最新网址| 亚洲欧美日韩第一区| 亚洲精品日本| 含羞草久久爱69一区| 欧美亚州一区二区三区| 免费久久99精品国产| 校园春色国产精品| 一本色道久久综合亚洲精品高清| 可以免费看不卡的av网站| 亚洲自拍偷拍视频| 亚洲韩国青草视频| 欧美午夜视频| 久久米奇亚洲| aa级大片欧美| 久久在线视频| 欧美日韩亚洲精品内裤| 欧美大片在线看免费观看| 欧美日韩精品伦理作品在线免费观看|