一步一步写算法(之寻找丢失的数)
生活随笔
收集整理的這篇文章主要介紹了
一步一步写算法(之寻找丢失的数)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一步一步寫算法(之尋找丟失的數(shù)) 原文:一步一步寫算法(之尋找丟失的數(shù))
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,我們進一步補充完整。
工作總結(jié):
【 聲明:版權(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ù)進行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進行訪問標(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,我們進一步補充完整。
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)化是可以不斷進行得,但是不見得適用于所有的場景
?? ?(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 林肯大陆后座皮套怎么拆
- 下一篇: 捷豹路虎中国怎么样