編程珠璣,相當不錯的一本書。其中很多金句需要在工作的過程當中,銘記於心:
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;
}
編程珠璣提供的代碼,果然簡潔: