在内存空间较为充足的情况下,有时候可以牺牲一些空间来换取程序的运行速度。查表法就是 以空间换取时间 的典型例子。 比如:编写程序统计一个4bit(0x0~0xF)数据中1的个数。 使用查表法: static int table[16] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
int get_digits_1_num(unsigned char data)
{
int cnt = 0;
unsigned char temp = data & 0xf;
cnt = table[temp];
return cnt;
}
优于:
int get_digits_1_num(unsigned char data)
{
int cnt = 0;
unsigned char temp = data & 0xf;
for (int i = 0; i < 4; i++)
{
if (temp & 0x01)
{
cnt++;
}
temp >>= 1;
}
return cnt;
}
查表法把0x0~0xF中的所有数据中每个数据的1的个数都记录下来,存放到一个表中。这样一来,数据与数据中1的个数就建立起了一一对应关系,就可以通过数组索引来获取得到结果。常规法使用for循环的方式来实现,缺点是占用了不少处理器的时间。 特别地,对于越复杂地运算,查表法较常规法更有优势。另一方面,查表法的代码往往比常规法要简洁些。
|