Programming Pearls Essay 01
01 如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示和排序集合?
1 Array.Sort(array);
02 如何使用位逻辑运算(例如与,或,移位)来实现位向量。
重要的概念:用一个n位长的字符串来表示一个所有元素都小于n的简单非负整数集合。
相对一般的数据而言,其特点是:
a,数据限制在一个范围里
b,数据没有重复
c,数据没有其他的关联项
int n = 100;
byte[] array = new byte[n];//可以储存[0,n*8)的数
//用int m举例,假设m在范围内
int m,index,step;//index确定byte数组的索引位置,step确定byte[index]里的bit位
index = m/8;
step = m%8;
byte temp = 1;
temp = temp<<step;
array[index] = array[index]||temp;
疑问:书中似乎是用byte位做标识的,因为“原话是用一个n位的字符串来表示文件”,用bit可以进一步压缩空间,因为每一个位上的值只是0或者1。
03 假设n为10000000,输入文件包含1000000个整数。使用位图排序并与系统排序比较效率。
系统排序的时间复杂度为O(nlogn),简单位图排序的时间复杂度是O(n)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace _01._03
{
class Program
{
static void Main(string[] args)
{
//模拟的数据源,看上去本身就是排好序的...
int arrayLength = 1000000;
int[] array = new int[arrayLength];
for (int i = 0; i < arrayLength; i++)
{
array[i] = i;
}
int resultLength = arrayLength / 8;
byte[] result = new byte[resultLength];//125000个byte就可以装下结果,新建的时候自动全设为0
int index, step,byteSize = sizeof(byte)*8;
byte temp;
foreach (var item in array)
{
temp = 1;
index = item / byteSize;
step = item % byteSize;
temp = (byte)(temp << step);
result[index] =(byte)(result[index] + temp);
}
}
}
}
最后的结果里每个byte都是0XFF,今天先到这。