【问题标题】:Using ASCII character sum for binary-searching a string?使用 ASCII 字符和对字符串进行二进制搜索?
【发布时间】:2011-10-08 03:16:21
【问题描述】:

我正在做一个小型项目 - 使用链表的学生数据库,这是我第一学期的一部分。规范是,用户应该能够使用名称首字母搜索记录,这是结构中的 char[4]。

现在有两种搜索首字母的方法,一种是通过线性搜索,这确实是低效的(我实际上并不关心,因为这不是某些公司的基本内容等)或通过二分搜索.

二进制搜索需要排序的数组,所以我在想如果使用字符串的 ASCII 和进行搜索是否有意义?

例如,记录 1 的初始值为“AB”,记录 2 的初始值为“CD”。两者的 ASCII 和为 65+66 = 131 & 67+68 = 135,列表使用首字母排序(使用 strcmp)。

所以当用户输入“AB”时,我将只查找数字 131,如果存在,则显示记录?

这可能是一个非常糟糕的主意,请不要对我发火并解释为什么这是一个坏主意。

【问题讨论】:

  • 在 2011 年,您不应该假设用户名可以用 ASCII 表示。我们使用 unicode 已经很久了。

标签: c algorithm search linked-list ascii


【解决方案1】:

对我来说似乎是一个好的开始。您将如何区分“TON”和“NOT”它们的总和是否相同(“碰撞”)?您是否建议采用两层方法?首先使用 ascii-sum 搜索,然后使用一些方法来解决冲突?似乎这里有一些关于散列的好信息:http://burtleburtle.net/bob/hash/index.html

【讨论】:

  • 是的,我在考虑两步搜索。散列对于我们的水平来说太高级了,事实上我们还没有教过任何与散列相关的东西——尽管我已经从互联网上学习了大部分我所知道的编程,但这并不重要。
【解决方案2】:

如果我理解正确,那么这将是一种非常错误的搜索首字母的方式。我看到的第一个问题是:

AD = 65+68 = 133
BC = 66+67 = 133

事实证明,它们确实无法区分。但是比较两个字母,甚至只是连接 ASCII 值有什么问题呢?

AD = 65.68 = 6568
BC = 66.67 = 6667

没睡多久,可能写的都写完了。

【讨论】:

  • 正如@Mystical 之前所说,我将进行两层搜索。所以这应该不是问题。当我检测到两个具有相同数字的元素时,我会比较字符。连接似乎是一个更好的主意,虽然我不知道二进制搜索是否适用于它(我认为是的,因为它在不断增加)。
【解决方案3】:

会有很多冲突。使用可扩展散列:

Wikipedia

Algorithm explained

【讨论】:

    【解决方案4】:

    如果你无论如何都要构造一个排序数组,那么计算这个(有损、有偏差的)哈希值并在排序列表中搜索它是没有意义的——在排序列表中进行二进制搜索同样快直接列出首字母。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 2021-11-19
      • 2015-06-15
      • 2013-05-22
      • 2017-04-30
      • 2017-01-26
      • 1970-01-01
      相关资源
      最近更新 更多