【问题标题】:Spell checker, unique number for word拼写检查器,单词的唯一编号
【发布时间】:2023-03-16 03:40:01
【问题描述】:

在学校,我的老师使用数字哈希或表示单词的键进行了高性能拼写检查。因此,存储的不是单词,而是密钥。然后使用字典中使用的相同算法将要检查的单词转换为其唯一编号。但是我不记得这个方法叫什么了,需要写一个类似的方法。

有人知道这种为一组字符生成唯一编号的方法吗?

【问题讨论】:

  • ps,这不是家庭作业。我正在将它用于工作中的项目。
  • 这称为hash,表示What's a good hash function for English words? 可能会回答你。
  • 每个单词,如果您将该单词的每个字符转换为 int,将为您提供每个单词的唯一编号...例如 - 将 'a' 转换为 int,你只需说 (int) a。
  • 感谢 rad 和 spock,那是我不记得的短语,“单词的散列”。

标签: c++ spell-checking


【解决方案1】:

实际上标准 c++ 库有一个 hash template structure

#include <iostream>
#include <functional>

int main() {
    std::string str = "Programmer";
    std::size_t str_hash = std::hash<std::string>{}(str);
    std::cout << str_hash ;
    return 0;
}

将输出 2561445211。

"std::hash{}(str)" 计算哈希值;

【讨论】:

  • 谢谢迷你詹姆斯·邦德先生,047 ;)
  • 我不知道标准库已经内置了这个。我的想法是对字典中的每个单词进行哈希处理,然后对要检查的单词进行哈希处理,b/c 这将在散列数字的排序列表中找到正确的单词,比匹配列表中的字符串更快。
  • @MattFomich 不客气。标准库自 2011 年版本的 C++(称为... C++11)以来就有它。您的拼写检查问题是更一般的集合交集问题的一个很好的例子,在您的情况下,单词是集合的元素。看看标准库的哈希集:std::unordered_set<std::string> dictionary。它的count(string word) 方法会在恒定时间内检查单词是否在集合中,而“哈希数字列表”将花费线性时间。
  • 嘿,你的代码实际上没有编译。我收到“不允许类型名称”错误。这有效:std::string str = "Programmer"; std::hash<:string> hash_fn; size_t str_hash = hash_fn(str); std::cout
  • 感谢关于无序集的信息。这就是我要尝试的。我有一个使用哈希表的拼写检查器,但是为了在您键入时进行检查,看起来无序集将是验证单词是否正确的最快方法。你知道哈希表是否和无序集一样快?
猜你喜欢
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多