《编程珠玑》之位图技术

编程珠玑,相当不错的一本书。其中很多金句需要在工作的过程当中,铭记于心:

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;
}

编程珠玑提供的代码,果然简洁:

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