【问题标题】:Big O Notation - Including Data Structure Costs?大 O 表示法 - 包括数据结构成本?
【发布时间】:2018-03-23 15:49:04
【问题描述】:

就我的问题而言,我将包含一个示例问题。

假设我们需要遍历一个包含 N 个元素的向量并删除重复项。所以,我们可能会使用一个集合,对吗? (让我们使用一个 C++ 集合,它是一棵树)

遍历每个元素的成本为 O(N) - 然后插入到集合数据结构中。

我的问题Has a log n cost with the Set structure, 我们插入了 N 次,这个算法是 O(N log N) 还是简单的 O(N)?我正在和一位教授讨论这个问题,我不确定。 Leetcode/SO/在线社区似乎忽略了数据结构成本,但从学术的角度来看,N 插入到红/黑树中,log N 最坏的情况 - 这是 Log N,N 次不?

为了澄清 - 是的,使用 unordered_set 更有意义,但这并不能使我的问题有效。

【问题讨论】:

  • “Leetcode/SO/在线社区似乎无视数据结构成本”[需要引用]
  • 您确定无论发生这种情况,他们指的不是哈希集吗? Set 并不意味着二叉搜索树,只是因为在 C++ 中就是这样

标签: algorithm big-o


【解决方案1】:

复杂性表示某些引用操作的计数。

例如,您可以很好地计算某些黑盒结构中的插入次数并枚举 O(N) 次插入。

但是,如果您专注于比较,并且您知道插入平均要花费 Log N 次比较,那么比较的总数是 O(N Log N)。

现在,如果您正在比较 Log N 个字符的字符串,您将计算 O(N Log²N) 个字符比较...

【讨论】:

    【解决方案2】:

    是的,它是O(n * log(n))。如果你有这样的方法

    public void foo(int n) {
        for (int i = 0; i < n; i++) {
            // Call a method that is in O(log n)
            someLogNMethod();
        }
    }
    

    然后foo 方法在O(n * log n) 时间运行。


    示例

    有很多非结构化的例子。就像在整数数组中计算 median 值一样。看看下面这个问题的解决方案,它首先通过 sorting 数组来解决这个问题。排序在Theta(n log n)(见comparison based sorting)。

    public int median(int[] values) {
        int[] sortedValues = sort(values);
    
        // Let's ignore special cases (even, empty, ...) for simplicity
        int indexOfMedian = values.length / 2;
    
        return sortedValues[indexOfMedian];
    }
    

    显然你不会将这个median 方法称为Theta(1),尽管它所做的一切都是在恒定时间 中运行的(不包括sort 方法)。

    但是,问题取决于sort 方法。您无法解决在O(1) 中查找一般数组的中位数 的问题。您需要在分析中包含sort。因此,该方法实际上在Theta(n log n + 1) 中运行,即Theta(n log n)

    请注意,问题实际上可以在Theta(n) 中解决(参见Find median of unsorted array in O(n) time)。

    【讨论】:

    • 下摆,中位数,不平均。并且获取 sorted 数组的中位数绝对是 Θ(1)。 [顺便说一句,未排序数组的中位数可以在 Θ(N) 操作中找到。]
    • @YvesDaoust Uff,当然是median。谢谢,已更正。
    • @YvesDaoust 是的,但我没有说明数组已排序。实现需要事先对其进行排序。我指的是一般计算数组的median的问题。
    • 我指的是您的“除了调用排序”。 [如上所述,排序不是强制性的。]
    • @YvesDaoust 我不太确定我明白你的意思。我再次编辑,也许这消除了混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多