【问题标题】:I need help writing pseudocode for findAll(k) method in binary search table我需要帮助为二进制搜索表中的 findAll(k) 方法编写伪代码
【发布时间】:2016-04-04 19:22:53
【问题描述】:

这是来自一个作业。确切的问题是:

“设计一种二分搜索算法的变体,用于在搜索表中执行 findAll(k) 操作(即,使用排序数组实现的映射,并且允许具有相同键的多个条目)使得新算法在 O(log n + s) 时间内运行,其中 n 是映射中的元素数,s 是返回的集合的大小。您必须提供伪代码并解释它如何达到所需的时间复杂度。"

我注意到的第一件事是我不能使用递归,因为我使用相同的参数 k(键)来搜索整个表。所以,这就是我目前所拥有的:

Algorithm findAll(k)
{
    for i = 0 to end of array
    {
        mid = (low + high) / 2;
        while k is not equal to mid
        {
            if k is less than mid
                mid = (low + mid) / 2;
            else
                mid = (mid + high) / 2;
        }
        store k in collection array;
        increment i;
    }
    return collection;
}

我希望它花费 O(log n) 时间进行搜索,并花费 s 时间将所有匹配的键存储在一个单独的数组中,该数组在最后返回。问题在于:

1) 我在循环中有一个循环,这不是我想要的(for 循环是为了确定结束)。

2)虽然它会遍历整个数组,但它会一遍又一遍地搜索相同的键,并且我无法在每次搜索后将其删除,因为这不是删除方法。

我该如何改进我的伪代码?

谢谢

【问题讨论】:

    标签: big-o binary-search pseudocode


    【解决方案1】:

    我会试一试这个问题。

    let array = {1, 2, 3, 3, 3, 4, 5, 5, 6, 7, 10}
    
    let k = 3
    

    我假设您希望 findAll(k) 在此特定示例中返回 {3, 3, 3}。为此,请去掉外循环并在循环后执行以下操作:

    1. 检查找到的值左侧的项目。如果该值与找到的值相同,请使用该值重复此步骤。否则,停止。
    2. 同样检查第一个循环中找到的值的右侧。

    完成上述步骤后,您应该有两个索引。找到索引之间的增量并添加 1。创建一个该大小的新数组并用 k 填充它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2013-09-27
      • 2015-06-05
      相关资源
      最近更新 更多