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

那誰(shuí)的技術(shù)博客

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

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

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

這兩個(gè)問(wèn)題是二分查找算法的典型應(yīng)用.

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

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

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

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

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

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

C代碼如下:
/*
 * 查找有序序列中 重復(fù)/不存在 的數(shù)算法演示
 * 版權(quán)所有:
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__)

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

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

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

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

/* 查找一個(gè)長(zhǎng)度為len的有序數(shù)組中哪個(gè)元素重復(fù)了 */
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]);
    }

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

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

    display_array(array, count);

    
/* 刪除其中的一個(gè)元素 */
    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);

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

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

    display_array(array, count 
+ 1);

    
/* 查找重復(fù)的元素 */
    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]之間的元素右移一個(gè)位置 */
    
for (i = x + 1; i < len - 1++i)
    {
        array[i 
+ 1= i;
    }

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

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

    
/* 將[x, len)的元素向左移動(dòng)一個(gè)位置 */
    
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ù)的返回值表示在它之前的元素都是正確的, 
     * 因此這個(gè)返回位置就是有重復(fù)的元素位置 + 1, 于是要減去1
     * 
*/
    
return find_not_exist(array, len) - 1;
}





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

評(píng)論

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

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

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

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

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

@阿福
你可能沒(méi)有仔細(xì)看我對(duì)問(wèn)題的描述,事實(shí)上,如果使用這里所用的二分查找算法,都不用遍歷一次,O(log(n))的時(shí)間復(fù)雜度就搞定問(wèn)題了.
2009-08-24 16:23 | 那誰(shuí)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            1024亚洲| 免费精品视频| 麻豆免费精品视频| 欧美在线高清| 午夜亚洲视频| 久久国产精品久久w女人spa| 亚洲欧美bt| 亚洲欧美日韩中文视频| 久久国产精品免费一区| 久久亚洲综合色| 亚洲黄色在线观看| 日韩一区二区高清| 午夜精品影院在线观看| 久久综合久久综合这里只有精品| 噜噜噜91成人网| 欧美日韩色婷婷| 国产在线视频欧美一区二区三区| 在线电影国产精品| 99精品视频免费观看视频| 亚洲字幕在线观看| 美女视频一区免费观看| 亚洲人成绝费网站色www| 亚洲女ⅴideoshd黑人| 蜜臀av性久久久久蜜臀aⅴ四虎 | 免费亚洲一区二区| 欧美日韩一二三四五区| 国产视频精品va久久久久久| 激情一区二区| 亚洲在线一区二区| 六月婷婷久久| 久久一区二区三区超碰国产精品| 久久精品电影| 亚洲黄色av一区| 亚洲免费在线视频一区 二区| 久久福利影视| 欧美午夜无遮挡| 亚洲国产美女久久久久| 欧美一站二站| 模特精品裸拍一区| 午夜精品亚洲| 欧美性片在线观看| 亚洲精品久久久一区二区三区| 久久激情综合网| 一本色道久久综合狠狠躁的推荐| 久久免费高清视频| 国产亚洲精品bv在线观看| 一区二区三区高清在线| 欧美mv日韩mv亚洲| 亚洲男人的天堂在线| 欧美午夜精品电影| 日韩一区二区精品葵司在线| 久久青草久久| 午夜亚洲福利在线老司机| 欧美日韩精品系列| 亚洲理论在线| 欧美成人国产va精品日本一级| 午夜欧美大尺度福利影院在线看 | 亚洲六月丁香色婷婷综合久久| 欧美中文字幕| 国产乱码精品一区二区三区不卡| 一本色道久久综合狠狠躁的推荐| 嫩草伊人久久精品少妇av杨幂| 欧美一区二区| 国产女主播一区二区三区| 国产精品成人aaaaa网站| 欧美日韩免费高清| 日韩性生活视频| 亚洲日本欧美日韩高观看| 欧美大片va欧美在线播放| 亚洲精品美女久久久久| 欧美成人在线免费视频| 欧美aaaaaaaa牛牛影院| 亚洲精品美女91| 亚洲韩国一区二区三区| 欧美电影在线| 中文一区二区| 午夜日韩在线| 在线国产精品一区| 91久久国产综合久久蜜月精品 | 日韩视频中文| 国产精品成人在线观看| 亚洲欧美国产制服动漫| 亚洲图片欧洲图片av| 亚洲在线一区二区| 国产欧美日韩在线视频| 久久精品国产免费观看| 久久久久免费观看| 亚洲精品偷拍| 亚洲综合大片69999| 黄色成人av| 91久久精品视频| 国产精品久久久久久妇女6080 | 久久久91精品| 一二三区精品福利视频| 亚洲丝袜av一区| 国语自产在线不卡| 日韩视频精品在线| 黄色国产精品| 一区二区三区波多野结衣在线观看| 国产精品日韩精品欧美精品| 久久爱www| 欧美激情无毛| 久久久亚洲人| 欧美午夜精品| 模特精品裸拍一区| 欧美性大战xxxxx久久久| 久久九九有精品国产23| 美女尤物久久精品| 午夜精品久久久久久久白皮肤| 久久精品免费观看| 亚洲视频福利| 免播放器亚洲一区| 欧美中文在线免费| 欧美区二区三区| 老牛影视一区二区三区| 欧美午夜不卡视频| 欧美激情免费在线| 国产亚洲精品成人av久久ww| 亚洲精品亚洲人成人网| 悠悠资源网亚洲青| 香蕉久久久久久久av网站| 99精品免费| 亚洲人成高清| 亚洲免费观看视频| 久久亚洲电影| 久久xxxx| 国产精品一区二区男女羞羞无遮挡| 亚洲国产另类久久精品| 狠狠色狠色综合曰曰| 亚洲欧美日韩精品| 亚洲一区二区四区| 欧美另类高清视频在线| 欧美v亚洲v综合ⅴ国产v| 国产一区二区三区在线观看免费| 亚洲人成高清| 夜夜精品视频| 欧美成人久久| 免费视频久久| 黄色国产精品一区二区三区| 亚洲在线观看免费视频| 亚洲综合三区| 国产精品久久久久久久久久ktv| 亚洲国产一区二区a毛片| 在线视频国产日韩| 久久精品一区中文字幕| 久久午夜影视| 影音先锋中文字幕一区二区| 国产精品亚洲综合| 亚洲一区二区三区高清不卡| 亚洲免费视频网站| 国产精品高潮呻吟久久av无限 | 国产精品视频| 午夜视频精品| 久久一区精品| 亚洲国产精品日韩| 欧美巨乳在线观看| 一本久道综合久久精品| 欧美亚洲一区二区在线| 国产日韩欧美一区| 久久精品毛片| 在线观看欧美亚洲| 欧美成人资源网| 一区二区三区欧美| 欧美在线视屏| 激情一区二区三区| 欧美精品一区二区精品网| 一本色道88久久加勒比精品| 亚洲欧美视频在线| 国产亚洲欧美日韩精品| 欧美国产日韩一区二区三区| 99精品热视频| 国产日韩精品久久久| 麻豆精品网站| 亚洲先锋成人| 欧美1区2区视频| 亚洲综合国产激情另类一区| 韩国av一区二区三区在线观看| 美女露胸一区二区三区| 99亚洲视频| 美女啪啪无遮挡免费久久网站| 99精品国产福利在线观看免费| 国产精品你懂的在线欣赏| 久久久精品999| 夜夜嗨av一区二区三区四区 | 久久亚洲春色中文字幕| 一本综合久久| 欧美激情一区二区三区在线 | 亚洲国产高清在线| 亚洲欧美制服另类日韩| 激情久久中文字幕| 欧美三日本三级少妇三2023| 久久国产欧美| 亚洲一区二区免费在线| 牛牛影视久久网| 欧美在线999| 在线性视频日韩欧美| 亚洲国产人成综合网站| 国产欧美日韩一区二区三区在线| 欧美精品一区在线观看| 久久久国产亚洲精品|