關於你的大的恆定位數組,大段常量,這裏有一個替代方法來設計表格供你考慮(我不知道你確切的需求,所以我不能說它是否會幫助或不)。
考慮類似於radix tree。爲了便於說明,讓我定義get函數:
#define TYP_CONST
#define TYP_ARRAY
struct node {
unsigned min;
unsigned max;
int typ;
union {
char *bits;
int constant;
} d;
struct node *left;
struct node *right;
}
struct bit_array {
unsigned length;
struct node *root;
}
int get(struct bit_array *b, unsigned ix)
{
struct node *n = b->root;
if (ix >= b->length)
return -1;
while (n) {
if (ix > n->max) {
n = n->right;
continue;
} else if (ix < n->min) {
n = n->left;
continue;
}
if (n->typ == TYP_CONST)
return n->d.constant;
ix -= n->min;
return !!(n->d.bits[ix/8] & (1 << ix%8));
}
return -1;
}
對人類而言,您希望通過樹的位進行搜索。每個節點負責一定範圍的位,並且通過對範圍進行二進制搜索以找到您想要的範圍。
找到範圍後,有兩個選項:常量或數組。如果不變,只需返回常量(爲您節省大量內存)。如果是數組,則在位數組中執行數組查找。
你將有O(log n)查找時間,而不是O(1)....雖然它應該仍然非常快。
這裏的難點在於設置合適的數據結構很煩人且容易出錯。但是你說陣列是恆定的,所以這可能不成問題。
我懷疑這是NP難,因爲沒有辦法建立一個命令來處理這些可能會導致DP樣解決方案,但我沒有知識來證明它。你可能會得到更好的理論或mathoverflow回答 – dfb 2012-04-23 18:40:13