algorithm - 与大O比较和对比
问题描述
谁能解释对空间复杂度的理解?在您自己看来,在设计算法时,哪种复杂性(时间或空间)更重要?
O(log2N)
和有什么区别O(Nlog2N)
?我观看了有关它的各种视频,但仍然不完全理解。
解决方案
根据定义,如果 f 和 g 是实数 x 的正函数,“g is O(f(x))”意味着存在一些 X 和一些 M,使得对于所有 x > X:g(x) <= M * f (X)
您可以用自然 n 替换实数 x 并获得相同的定义。
在实践中,假设您有一些数组(列表、向量)并且您有一些任务。
假设数字数组是有序的,您需要找到一个特定的数字。因此,您检查数组的中间,而不是将获得的数字与需要查找的数字进行比较,然后检查数组的中部或上半部或下半部。然后你继续直到你找到证明没有这个数字的数字。尝试次数将接近 log2(n),因此您可以说时间是 O(log N),因为 O(log2 N) 是相同的。
如果您逐个遍历数组,则必须检查所有元素,时间将为 O(n)。假设您有一百万个元素。然后在二进制搜索中你需要大约 20 次检查,在完整循环中你需要百万。这就是为什么 O(log N) 和 O(N) 之间的差异至关重要的原因。
另一个例子,你需要对一个数组进行排序(排序)。您可以通过检查所有元素来找到最小元素。然后你通过检查所有期望的第一个来找到第二个最小值,然后你继续直到你得到最大的元素。数字计算为 n + (n - 1) + ... + 2 + 1 = n (n + 1) / 2 即 O (n^2)。
您还可以使用快速排序算法,将二进制搜索和所有元素的完整循环结合起来。在这种情况下,时间将为 O (n * log n)
现在假设您在数组中有一百万个元素。如果您使用第一种方法对数组进行排序,则时间将接近 (10^6)^2 = 10^12 = 1,000,000,000,000 次操作(实际数量会更少,但只计算幂)。第二种方法将给出 10^6 * log(10^6) 的结果,大约为 10^6 * 10 = 10,000,000(实际数字也将是 20,000,000,我们在检查 big-O 时不计算在内)。看到不同。
同样的空间问题。假设您需要对用户(输入文件)的输入值做一些事情,而您别无选择,只能将所有值保存在内存中。在这种情况下,您需要 O(n) 内存。但是,如果您找到的解决方案不是将所有值都保存在内存中,而只是将当前输入值和其他一些技术变量保存在内存中,那么您会说您需要 O(1) 的内存。只需将数百万字节与几个字节进行比较,即可了解它的重要性。
不需要完整数组的任务示例是输入文件中给出的所有值的最后 2 位乘积。您不需要为完整的值列表保留内存。
推荐阅读
- python-3.x - 如何在flask-restful中实现多维度查询资源?
- c - c中的两个语句有什么区别?
- swiftui - 被 TabView 隐藏的 UIView
- python - 如何解决 Selenium 异常:“无效参数 'url' 必须是字符串”
- kubernetes - 使用命令行创建持久卷(不使用任何文件)
- c# - 如何在 Xamarin Forms 中向 com.sec.android.provider.badge.BadgeProvider uri content://com.sec.badge/apps 添加权限
- c# - 如何在 MVC 核心中创建多级菜单?
- java - ArrayList时如何mock
在方法参数中? - vue.js - vite2和vue3如何构建多页面应用?
- assembly - RiscV交换指令在单周期CPU中是不可能的,因为它会写两个寄存器?