《編程珠璣》之位圖技術

編程珠璣,相當不錯的一本書。其中很多金句需要在工作的過程當中,銘記於心:

chapter 1,書中的金典語句:

@1,明確問題(問對正確的問題),這場戰役就成功了90%.

@2,幾分鐘的仔細研究可以大幅削減代碼的長度、程序員的時間和程序系統運行的時間。

@3,設計者確定其設計已經達到了完美的標準,不是不能再增加任何東西,而是不能再減少任何東西。

@4,程序員的主要問題,與其說是技術問題,還不如說是心理問題:他不能解決問題,是因爲他試圖解決錯誤的問題。問題的最終解決,是通過打破他的概念壁壘,進而去解決一個較簡單的問題而實現的。

 

明確問題:

解決實際的問題,首先是找到現實問題裏面,包含的最本質的問題,然後加以提煉成更加清晰規範化的條件:

輸入:文件包含最多10^7個正整數、每個正整數不大於10^7。並且數據均不重複,數據之間無關聯。

輸出:升序輸出輸入的列表

外部約束:約1MB的內存空間,目標是10秒鐘運行完全。

作者討論了該問題的幾種解決方案,比較了幾種方案的實現複雜度和性能。最終針對問題,選用了“結構簡單、部件少、易於維護、非常堅固”的 位圖方案 

這裏附加自己的代碼實現,關鍵還是在於位圖技術的有效應用。

#include<stdio.h>
#include<assert.h>

#define BITMAP_SIZE 6
typedef unsigned int MAP_TYPE;
unsigned int g_map_item_size = 8*sizeof(MAP_TYPE);


/** \brief 使用位圖對數組進行排序
 * \param arr:帶排序數組,要求數組元素不重複,且爲正整數。
 * \param size: 數組大小
 * \return 空
 */
void sort_unique_positive_integer(int *arr, unsigned int size)
{
    MAP_TYPE bitMap[BITMAP_SIZE];

    //step 1, bitMap init 0
    for(int i=0;i<BITMAP_SIZE;++i)
    {
        bitMap[i]=0;
    }

    //step 2, set bitMap bit value according to input value
    for(int i=0;i<size;++i)
    {
        int idx=arr[i]/g_map_item_size;
        int idxBit=arr[i]%g_map_item_size;
        assert(idx < BITMAP_SIZE);
        bitMap[idx] = (bitMap[idx] | (1<<idxBit));
    }

    //step 3,output result according to bitMap bit value
    for(int i=0;i<BITMAP_SIZE;++i)
    {
        for(int j=0;j<g_map_item_size;++j)
        {
            if(0 != ((bitMap[i])&(1<<j)))
            {
                printf("%d ",(g_map_item_size*i)+j);
            }
        }
    }
    printf("\n");
}


int main()
{

    int a[30]={4,5,7,13,47,45,23,44,16,8,33,24,27,28,0};
    sort_unique_positive_integer(a,30);

    return 0;
}

編程珠璣提供的代碼,果然簡潔:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章