日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一步一步写算法(之寻找丢失的数)

發(fā)布時間:2024/10/12 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一步一步写算法(之寻找丢失的数) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一步一步寫算法(之尋找丟失的數(shù)) 原文:一步一步寫算法(之尋找丟失的數(shù))

【 聲明:版權(quán)所有,歡迎轉(zhuǎn)載,請勿用于商業(yè)用途。 ?聯(lián)系信箱:feixiaoxing @163.com】


?? ?假設(shè)我們有一個1億個數(shù)據(jù),其中數(shù)據(jù)的范圍是0~1億,也就是100M的數(shù)據(jù)。但是這個數(shù)組中丟了一些數(shù)據(jù),比如說少了5啊,少了10啊,那么有什么辦法可以把這些丟失的數(shù)據(jù)找回來呢?這個題目不難,但是它可以幫助我們拓展思路,不斷提高算法的運行效率。

?? ?對于這個問題,我們一個最簡單的思路就是對各個數(shù)據(jù)進(jìn)行flag判斷,然后依次輸出數(shù)據(jù)。

void get_lost_number(int data[], int length) {int index;assert(NULL != data && 0 != length);unsigned char* pFlag = (unsigned char*)malloc(length * sizeof(unsigned char));memset(pFlag, 0, length * sizeof(unsigned char));for(index = 0; index < length; index ++){if(0 == pFlag[data[index]])pFlag[data[index]] = 1;}for(index = 0; index < length; index++){if(0 == pFlag[index])printf("%d\n", index);}free(pFlag);return; }?? ?可能朋友也看到了,上面的代碼需要分配和原來數(shù)據(jù)一樣length的空間。其實我們可以用bit進(jìn)行訪問標(biāo)志的設(shè)定,所以我們申請的空間還可以減少。

void get_lost_number(int data[], int length) {int index;assert(NULL != data && 0 != length);unsigned char* pFlag = (unsigned char*)malloc((length + 7) >> 3);memset(pFlag, 0, length * sizeof(unsigned char));for(index = 0; index < length; index ++){if(0 == (pFlag[data[index] >> 3] & (1 << (data[index] % 8))))pFlag[data[index] >> 3] |= 1 << (data[index] % 8);}for(index = 0; index < length; index++){if(0 == (pFlag[data[index] >> 3] & (1 << (data[index] % 8))))printf("%d\n", index);}free(pFlag);return; }?? ?上面的代碼已經(jīng)在空間上面有所減小,那么有什么辦法并行運算這些數(shù)據(jù)呢?
void get_lost_number(int data[], int length) {int index;RANGE range[4] = {0};assert(NULL != data && 0 != length);unsigned char* pFlag = (unsigned char*)malloc((length + 7) >> 3);memset(pFlag, 0, length * sizeof(unsigned char));range[0].start = 0, range[0].end = length >> 2;range[1].start = length >> 2 , range[1].end = length >> 1;range[2].start = length >> 1 , range[2].end = length >> 2 * 3;range[3].start = length >> 2 * 3, range[3].end = length;#pragma omp parallel forfor(index = 0; index < 4; index ++){_get_lost_number(data, range[index].start, range[index].end, pFlag);}for(index = 0; index < length; index++){if(0 == (pFlag[data[index] >> 3] & (1 << (data[index] % 8))))printf("%d\n", index);}free(pFlag);return; }?? ?為了多核的并行計算,我們添加了子函數(shù)_get_lost,我們進(jìn)一步補充完整。

typedef struct _RANGE {int start;int end; }RANGE;void _get_lost_number(int data[], int start, int end, unsigned char pFlag[]) {int index;for(index = start; index < end; index++){if(0 == (pFlag[data[index] >> 3] & (1 << (data[index] % 8))))pFlag[data[index] >> 3] |= 1 << (data[index] % 8);} }
工作總結(jié):

?? ?(1)代碼的優(yōu)化是可以不斷進(jìn)行得,但是不見得適用于所有的場景

?? ?(2)目前的cpu已經(jīng)開始從2核->4核->8核轉(zhuǎn)變,朋友們在可能的情況下盡量多掌握一些多核編程的知識。


?? ?

?? ?

posted on 2014-12-11 10:06 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/4156960.html

總結(jié)

以上是生活随笔為你收集整理的一步一步写算法(之寻找丢失的数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。