【问题标题】:How to determine what character would be at a given index in a sorted string without hashing or sorting?如何在没有散列或排序的情况下确定排序字符串中给定索引处的字符?
【发布时间】:2017-06-05 17:31:05
【问题描述】:

我们得到一个 string 和一个 integer。如果要将字符按排序顺序排列,我们必须知道在字符串中的那个整数位置处是什么字符

举例

String = LALIT  
Index = 3  
Sorted string  AILLT and the character at position 3 is L

不排序可以解决这个问题吗?
如果是,那么有人可以提供伪代码

【问题讨论】:

    标签: string algorithm sorting hash


    【解决方案1】:

    是的,可以这样做。你正在寻找一个叫做selection algorithm的东西,给定一个元素列表和一个数字k,返回如果元素要在位置k中的元素排序。令人惊讶的是,无需对整个列表进行排序就可以做到这一点!

    用于选择的最简单的非排序算法称为quickselect,它在预期时间 O(n) 内运行,并且如果允许您修改原始数组,则仅使用 O(1) 辅助存储空间。快速选择背后的想法是执行快速排序的一个步骤 - 选择一个枢轴元素,将元素划分为小于枢轴的元素,等于枢轴的元素和大于枢轴的元素 - 然后查看基于此会发生什么。如果在此步骤之后枢轴元素最终位于位置 k,那么您就完成了 - 这就是最终序列中位于位置 k 的元素。如果枢轴位于高于 k 的位置,则递归地查看枢轴的左侧(第 k 个最小元素在其中某处),如果枢轴位于在低于 k 的位置,递归地查看枢轴的右侧(第 k 个最小的元素在其中某处)。

    也存在其他方法,例如中位数算法,该算法始终在最坏情况 O(n) 时间内运行,但它是一种经典的“棘手的算法”。

    【讨论】:

    • 另一种直接的线性算法是统计字符频率,然后累积扫描直方图来推断索引对应的字符位置。实际上,这对于 8 位字符集是可行的,但不太可能成为完整 unicode 的胜利。
    • @doynax 绝对。我在“散列”(带有身份散列)或“排序”(它基本上是计数排序)下捆绑了松散的含义,所以这里没有考虑。
    • 你能详细说明一下吗?您可能希望将其作为一个单独的问题发布在网站上。
    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2019-03-23
    • 2017-05-26
    • 1970-01-01
    相关资源
    最近更新 更多