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

那誰的技術博客

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

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

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

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

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

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

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

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

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

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

C代碼如下:
/*
 * 查找有序序列中 重復/不存在 的數算法演示
 * 版權所有:
http://www.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的數組, 其中array[i] = i(0<=i<len) */
void generate_array(int array[], int len);
    
/* 向長度為len的有序數組中新增一個元素x(0<=x<len - 1), 同時保持原有數組有序 */
void add_to_array(int array[], int len, int x);

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

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

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

/* 查找一個長度為len的有序數組中哪個元素重復了 */
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]);
    }

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

    
/* 首先生成一個元素都是有序的整型數組 */
    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, 這樣數組仍然是有序的 */
    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()函數的返回值表示在它之前的元素都是正確的, 
     * 因此這個返回位置就是有重復的元素位置 + 1, 于是要減去1
     * 
*/
    
return find_not_exist(array, len) - 1;
}





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

評論

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

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

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

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

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

@阿福
你可能沒有仔細看我對問題的描述,事實上,如果使用這里所用的二分查找算法,都不用遍歷一次,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>
            久久久久在线观看| 久久久国产精品一区二区三区| 久久精品中文字幕一区| 久久国产福利国产秒拍| 亚洲国产天堂网精品网站| 亚洲九九九在线观看| 国产日韩欧美综合一区| 亚洲风情在线资源站| 国产精品久久久久久久7电影| 久久精品夜夜夜夜久久| 欧美特黄一级大片| 欧美大色视频| 黄色日韩精品| 亚洲欧美影院| 亚洲一区二区三区精品在线| 老鸭窝亚洲一区二区三区| 欧美亚洲一区二区在线| 欧美日韩成人综合天天影院| 麻豆精品精品国产自在97香蕉| 欧美视频中文一区二区三区在线观看| 久久精品二区| 国产亚洲aⅴaaaaaa毛片| 亚洲社区在线观看| 久久久91精品国产一区二区精品| 欧美经典一区二区三区| 欧美ed2k| 亚洲激情在线观看| 欧美成年人视频网站欧美| 欧美大尺度在线| 亚洲卡通欧美制服中文| 欧美精品1区2区3区| 亚洲免费成人av电影| 中文网丁香综合网| 国产精品国产精品| 久久男人av资源网站| 亚洲第一区色| 午夜精品久久久久久久白皮肤| 国产精品久久久久免费a∨大胸| 亚洲视频在线免费观看| 欧美中文字幕在线视频| 精品成人免费| 国产精品久久久久7777婷婷| 久久国产婷婷国产香蕉| 亚洲国产精品999| 欧美一级理论性理论a| 亚洲国产日韩在线| 国产日韩精品视频一区| 欧美交受高潮1| 久久免费黄色| 午夜久久美女| 亚洲欧美视频一区二区三区| 亚洲国产精品第一区二区| 久久aⅴ乱码一区二区三区| 日韩一级精品视频在线观看| 国内精品一区二区三区| 欧美日韩视频在线第一区| 亚洲欧美久久久久一区二区三区| 欧美77777| 久久精品国产77777蜜臀| 亚洲精品综合精品自拍| 在线播放亚洲| 国产九色精品成人porny| 欧美精品乱码久久久久久按摩| 久久电影一区| 欧美在线观看天堂一区二区三区| 亚洲人成毛片在线播放女女| 欧美福利视频在线| 亚洲午夜久久久| 亚洲一区二区成人| 欧美日韩亚洲国产一区| 欧美一级成年大片在线观看| 亚洲乱码国产乱码精品精| 久久久噜噜噜久噜久久| 亚洲视频在线观看免费| 亚洲三级电影在线观看| 亚洲丰满在线| 一区二区三区波多野结衣在线观看| 亚洲激情视频在线| 日韩一级视频免费观看在线| 亚洲日韩欧美视频| 夜夜嗨av一区二区三区四季av| 亚洲国产视频一区二区| 一区二区三区四区五区视频| 亚洲欧美福利一区二区| 久久精品91| 欧美激情久久久| 欧美激情视频在线免费观看 欧美视频免费一| 久久久精品午夜少妇| 欧美激情性爽国产精品17p| 亚洲美女视频在线免费观看| 午夜精品一区二区三区在线播放| 欧美一区二区三区视频免费播放| 久久久久久久久久码影片| 欧美日韩一区综合| 欧美日韩伦理在线| 国产精品美女久久久浪潮软件| 欧美成人中文| 国产午夜精品久久久久久久| 99视频在线精品国自产拍免费观看| 久久精品视频在线播放| 亚洲理伦在线| 欧美一区二区大片| 欧美性开放视频| 亚洲精品视频在线看| 亚洲影视综合| 亚洲精品视频啊美女在线直播| 中文在线资源观看视频网站免费不卡| 久久不射中文字幕| 国产视频在线一区二区| 久久99伊人| 亚洲视频一二区| 久久久999精品视频| 亚洲高清在线精品| 欧美影院成人| 韩国女主播一区| 亚洲视频在线观看三级| 亚洲日本国产| 国产精品乱码人人做人人爱| 亚洲性夜色噜噜噜7777| 99视频精品| 美日韩丰满少妇在线观看| 亚洲成在线观看| 最近看过的日韩成人| 欧美啪啪一区| 欧美一区二区网站| 亚洲影院在线观看| 在线观看视频免费一区二区三区| 美女999久久久精品视频| 六十路精品视频| 亚洲一区黄色| 理论片一区二区在线| 亚洲网在线观看| 久久综合精品国产一区二区三区| 一区二区在线视频| 日韩小视频在线观看| 国内精品久久久久影院 日本资源| 免费看成人av| 国产亚洲成年网址在线观看| 亚洲国产精品成人va在线观看| 欧美先锋影音| 91久久精品国产91性色| 在线精品高清中文字幕| 亚洲欧美日韩直播| 亚洲一区二区三区精品在线| 久热成人在线视频| 久久久精品一区| 国产午夜久久久久| 香蕉乱码成人久久天堂爱免费| 亚洲一区二区在线看| 欧美激情久久久久| 亚洲成色777777女色窝| 亚洲国产欧美日韩| 欧美大香线蕉线伊人久久国产精品| 久久久久久久久久久久久女国产乱| 欧美亚一区二区| 91久久精品国产| 亚洲欧美久久久| 国产九九精品| 久久久精品日韩欧美| 欧美国产高潮xxxx1819| 国产欧美日韩一区二区三区在线 | 久久综合中文字幕| 欧美成在线观看| 一本色道久久综合亚洲精品按摩 | 国产精品wwwwww| 亚洲麻豆国产自偷在线| 羞羞答答国产精品www一本 | 国产亚洲一级| 蜜桃久久av| 国外精品视频| 国产精品国产三级国产aⅴ无密码| 亚洲网站在线看| 噜噜噜91成人网| 亚洲视频在线观看网站| 狠狠入ady亚洲精品| 欧美日韩一卡| 久久久免费av| 午夜天堂精品久久久久| 久久伊伊香蕉| 亚洲国产日韩在线| 在线观看欧美黄色| 欧美日韩视频在线一区二区| 最近中文字幕mv在线一区二区三区四区 | 久久一区二区三区av| 亚洲欧美日韩国产一区| 国产一区二区黄色| 欧美日韩理论| 亚洲一区二区三区免费视频 | 亚洲国产美女久久久久| 国产精品夜色7777狼人| 国产精品美女999| 国产精品老牛| 激情六月婷婷久久| 在线日韩av片| 亚洲三级色网| 亚洲欧美中文在线视频| 欧美一区二区三区四区高清| 欧美日本在线播放| 国产精品私房写真福利视频| 韩国一区二区三区美女美女秀|