我正在将一个小C ++程序改写为普通C,这是一个非常简单的程序,它使用map
计算输入中单词的出现。我正在使用静态大小的哈希表(包含大小和指向链接节点列表的指针数组的结构)。我在重写C部分之后遇到了麻烦。
#if 1 // switch between 1 and 0
# include <tr1/unordered_map>
typedef std::tr1::unordered_map<std::string,int> map_t;
#else
# include <map>
typedef std::map<std::string,int> map_t;
#endif
我主要使用哈希函数实现了无序版本,我用这种方式
#if 1 // switch between 1 and 0
int hash_function(const char *key, int size);
#else
#define hash_function(key, size) .......
#endif
但是现在我不知道宏应该怎么样,因为我想要对表进行排序,并且我有表的静态大小。因为我没有地图方面的经验,所以我不知道是否有任何传统的实现方法。
我知道将该表用作二维数组,作为简单矩阵,并从上到下逐列填充。
再说一次,有没有更好的传统方式呢?
答案 0 :(得分:1)
有序散列映射的一个非常典型的实现只是一个常规散列映射,其中包含按顺序遍历所有元素的附加链表。诀窍是在每次插入和删除时正确维护此链表。散列函数不(需要)改变b / w和有序以及无序的散列映射。
你的2d数组想法的主要问题是它消耗n*sizeOfHashTable
空间,其中大部分是浪费。
如果您正在实现一个有序映射,您通常会采用任何有序的数据结构,如二进制搜索树,只需让键(您排序的那些)也具有与之关联的值。那么你根本不使用哈希函数。