O(m * n) + O((m + n) * log(m + n)) 的复杂度评估是多少

时间:2021-07-23 13:24:10

标签: python algorithm time-complexity

我有以下 Python 代码,a 和 b 是列表(我知道这不是获得交集的最佳方式):

private DefaultRequest prepareRequest(HttpMethodName method, InputStream content) {
        Map<String,String> headers = new HashMap<>();
        headers.put("Content-type", "application/json");
        headers.put("type", "AUTH_TYPE.AWS_IAM");
        headers.put("X-Amz-Security-Token",securityToken);
        DefaultRequest request = new DefaultRequest(API_GATEWAY_SERVICE_NAME);
        request.setHttpMethod(method);
        request.setContent(content);
        request.setEndpoint(this.endpoint);
        request.setHeaders(headers);

        return request;
    }

让我们调用 len(a) - m 和 len(b) - n,其中没有关于 a 和 b 的附加信息。那么给定代码的时间复杂度为 O(m) + O(n) + O(m * n) + O((m + n) * log(m + n))。

我绝对可以缩短 O(m) 和 O(n),因为它们远小于 O(m * n),但是我该怎么处理 O((m + n) * log(m + n) )?

我如何比较 O(m * n) 和 O((m + n) * log(m + n))?我应该在最终评估中保留 O((m + n) * log(m + n)) 吗?

2 个答案:

答案 0 :(得分:1)

您可以将总输入大小视为n;哪个论点对总数的贡献并不重要。 (两个极端是当一个或另一个参数为空时;将项目从一个参数移动到另一个参数不会改变您将要做的工作总量。)

因此,set(a)set(b) 都是 O(n) 操作。

a & b 也是 O(n);您不需要将 a 的每个元素与 b 的每个元素进行比较来计算交集,因为集合是基于哈希的。您基本上只需进行 O(n) 次恒定时间查找。 (我忽略了使集合查找线性化的可怕的极端情况。如果您的数据具有一个哈希函数,该函数不会将每个项目都映射到相同的值,那么您不会遇到最坏的情况。)

sorted(a&b)(不需要先创建一个列表,但这也只是一个 O(n) 操作)需要 O(n lg n)。

因为前面的每一个操作都是依次执行的,所以get_intersection的总复杂度是O(n lg n)。

答案 1 :(得分:0)

我认为您无法简化表达式。

事实上,如果你将 m 设置为一个常量值,比如 5,你有一个复杂性

5n + (n+5)log(n+5) = O(n log(n))

并且第一项被吸收了。

但是如果你设置了 m = n

n² + 2n log(2n) = O(n²)

这一次吸收了第二项。所以你只能写

O(mn + (m+n) log(m+n)).

随着变量的变化,s 是总和,p 是乘积,

O(p + s log(s)).