Algorithm 使用二进制搜索计算出现次数

Algorithm 使用二进制搜索计算出现次数,algorithm,sorting,pseudocode,Algorithm,Sorting,Pseudocode,假设我对数组A进行了长度为n的排序,所以为1 我需要编写一个程序的伪代码,它给出每个元素所有出现的输出。 算法运行时间必须为最大kc1+c2*logn 示例-A=[1,1,2,2,5,5,5]->1,22,35,4 当我要计算的第一个元素是[1]并且我需要找到他最后出现的元素时,我考虑使用二进制搜索。 然后下一个元素是[last occurrence index+1],依此类推 我有点难以理解这个想法,把它写成伪代码 tnx递归算法,它获取左右位置并计算中间位置。如果数字发生变化,则继续深入,e

假设我对数组A进行了长度为n的排序,所以为1 我需要编写一个程序的伪代码,它给出每个元素所有出现的输出。 算法运行时间必须为最大kc1+c2*logn

示例-A=[1,1,2,2,5,5,5]->1,22,35,4

当我要计算的第一个元素是[1]并且我需要找到他最后出现的元素时,我考虑使用二进制搜索。 然后下一个元素是[last occurrence index+1],依此类推

我有点难以理解这个想法,把它写成伪代码


tnx

递归算法,它获取左右位置并计算中间位置。如果数字发生变化,则继续深入,en edge。到目前为止,它是简单的二进制搜索。但一旦它在距离=1时检测到一条边,即数字的变化,它将返回4个值:“什么数字序列结束”、“在什么位置”、“什么开始”、“在什么位置”。然后,父节点从左侧和右侧合并这4个值,如果它检测到完整的序列“在中间”,它会立即打印它,并从左侧传递结束边,从右侧传递起始边。

不可能实现这种渐进复杂性。
原因是无论是什么算法,当所有n个元素都是不同的时,它必须返回所有元素。这意味着它必须读取所有元素。当然,此操作会发生。

您可以计算Ologn中一个条目的出现次数

static int count(int[] array, int target, int start, int end, Func<int, int, bool> compare)
    {
        if (end < start) { return start; }

        int m = (start + end) / 2;

        if (compare(target, array[m])) { return count(array, target, start, m - 1, compare); }
        else { return count(array, target, m + 1, end, compare); }
    }


    static void Main(string[] args)
    {
        int[] a = { 1, 3, 8, 12, 12, 12, 25, 88 };
        int r1 = count(a, 12, 0, a.Length - 1, (x1, x2) =>
            {
                return x1 < x2;
            });

        int r2 = count(a, 12, 0, a.Length - 1, (x1, x2) =>
        {
            return x1 <= x2;
        });

        Console.Out.WriteLine("count=" + (r1 - r2).ToString());
    }

你有什么具体问题?使用二进制搜索查找第一个和最后一个匹配项的想法本身是正确的。常规二进制搜索将为我提供特定数字的索引,但现在我在某些索引中有相同的数字-如何修改二进制搜索以便每次只查找最后一个@USER2040251您需要计算X的出现次数吗?或者有哪些数字以及每个数字的计数?有哪些数字以及每个数字的计数看到这个:我不确定我理解-如果中间元素和第一个元素之间的数字没有变化,会发生什么?那么在这一部分中就不会深入了。只有在内部某个地方有边缘的部分,它才能走得更深。即优化遍历算法遍历所有元素并计算当前数的出现次数,然后将找到的边的信息返回给递归调用的父fallbeck。父级将从左侧和右侧合并信息,如果可以,打印完成的序列,并将剩余的两条边传递给父级。@john-废弃它。现在我想起来了,解决方案可能会更简单。不需要合并和其他东西。当往深处走时,总是先往左边走,再往深处走。找到边后,将其保存在全局变量中。一旦找到另一个边缘,您可以预期它是下一个顺序,因此打印信息并记住新边缘。当然,省略加工零件,无编号变化-无边缘。