當前位置:
首頁 >
一步一步写算法(之寻找丢失的数)
發布時間:2024/10/12
47
豆豆
生活随笔
收集整理的這篇文章主要介紹了
一步一步写算法(之寻找丢失的数)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一步一步寫算法(之尋找丟失的數) 原文:一步一步寫算法(之尋找丟失的數)
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; }?? ?為了多核的并行計算,我們添加了子函數_get_lost,我們進一步補充完整。
工作總結:
【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 ?聯系信箱:feixiaoxing @163.com】
?? ?假設我們有一個1億個數據,其中數據的范圍是0~1億,也就是100M的數據。但是這個數組中丟了一些數據,比如說少了5啊,少了10啊,那么有什么辦法可以把這些丟失的數據找回來呢?這個題目不難,但是它可以幫助我們拓展思路,不斷提高算法的運行效率。
?? ?對于這個問題,我們一個最簡單的思路就是對各個數據進行flag判斷,然后依次輸出數據。
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; }?? ?可能朋友也看到了,上面的代碼需要分配和原來數據一樣length的空間。其實我們可以用bit進行訪問標志的設定,所以我們申請的空間還可以減少。
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; }?? ?上面的代碼已經在空間上面有所減小,那么有什么辦法并行運算這些數據呢?
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; }?? ?為了多核的并行計算,我們添加了子函數_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);} }
工作總結:
?? ?(1)代碼的優化是可以不斷進行得,但是不見得適用于所有的場景
?? ?(2)目前的cpu已經開始從2核->4核->8核轉變,朋友們在可能的情況下盡量多掌握一些多核編程的知識。
?? ?
?? ?
posted on 2014-12-11 10:06 NET未來之路 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/lonelyxmas/p/4156960.html
總結
以上是生活随笔為你收集整理的一步一步写算法(之寻找丢失的数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 林肯大陆后座皮套怎么拆
- 下一篇: 有个名字叫随便乱记——css3