1,通过不断向intSet插入元素判断是否重复
stl::set使用二叉查找树,在当m=maxval时有最差情况
2,增加个bool find(int t)?,想不到怎么再让它更强壮了
3,无论是数组,链表,向量,insert要比find快一点点,但是都是同一个数量级的
4,减少了函数调用的开销,这是巨大的优化,而且不会栈溢出
5,一次分配,重复使用,类似的东西还有对象池,线程池等各种池
6,此时数组,链表,位向量,桶会达到最优情况,二叉查找树会达到最差情况
7,使用标记元素,插入时删除
8,不大理解,怎么"同时在许多位上"进行并行操作?
9,使用移位进行除法,这样每个桶都必须装2n个元素
10,没看懂题目
11,在基于集合的算法中,使用位向量+floyd的算法无疑是最快的
补充问题:spell程序
spell程序的作用是进行拼写检查,即检查某单词是否在词典中
首先,程序剥去前后缀,使75000个单词减少为30000个
然后,建立227位的散列表(合适的散列函数很重要),每个单词仅存储一位,总共有大概13000万位,但是只有3万个单词,这样单词已经相当稀疏了,某个单词不幸命中的概率为1/4000,也就是每4000个错误单词就会判断错一个,但是由于错误单词
出现的概率很低了,因此出错的概率可以接受,
最后,进行压缩,30000*27位有800k之多,压缩之后不到64k,而且存储了数百个单词的位置来加速查找,现在字典已经相当快了
不过具体是怎么压缩的?