arrays - 基于数组中的最大数量迭代的算法的复杂性?
问题描述
所以我正在做一个朋友向我提议的竞争性编程挑战,我能够弄清楚,但在那之后,我决定用其他方法来解决它。
问题是,我确实找到了一种奇怪的方法,但我们无法真正理解复杂性,因为我们认为它可能没有正式的复杂性?
问题的简要说明如下:
你有一个整数数组(可能没有排序),都是正数且大于 0。
你的任务是告诉我数组中缺少的第一个整数,例如:
[1, 4, 5,3, 2, 6, 10] ==> 答案是 7
我的有趣做法是:
您遍历数组一次,并将所有值放入 HashMap 中,将数组中的最大值保存在单独的变量中。
之后,您创建一个从 1 到数组最大值的 for 循环。
然后检查哈希图中是否存在 for 循环索引,如果不存在,则您已找到答案。
问题是,这将是 O(n),但是 for 循环有点搞砸了。是 O(n) 吗?说 O(n) 感觉不对。
想象一下这个伪代码:
让 numArray = {1, 2, 3, 1000};
for i=1 TO max(numArray){
print "Hello there buddy"
}
这会有什么复杂性?它甚至有形式上的复杂性吗?
根据我的理解,说它具有复杂性并没有真正遵循 Big O 表示法的目的,因为它的目的是评估运行某些代码所需的时间,输入更改的大小,在这里输入的大小无关紧要,只要最大数的值...如果数组有 3 个元素,最大值为 10 亿,它仍然需要 10 亿次迭代...
那么,有没有一个具体的符号呢?
你会如何描述这个问题?
解决方案
在这种情况下,我们假设一个新变量 m 并说这个解是O(m)
,其中 m 将是数组中的最大数;而不是说O(n)
。
只是一个额外的输入,解决这个问题的另一种更好的方法如下:
认为
a = [1, 4, 5,3, 2, 6, 10]
for i in 0->n:
if (a[i] < n)
a[a[i]] = -a[a[i]];
for i in 0->n:
if (a[i] > 0)
print (i);
基本上这里的想法是通过将其符号反转为 -ve 来标记访问过的索引。重新迭代第一个找到的正元素的索引将是丢失的项目。
推荐阅读
- swiftui - 自隐藏视图之间的智能分隔符
- python - 使用 amCharts 将 CSV 转换为 JSON 树结构(分层)?
- python-3.x - 读取由 nan 行拆分的数据帧,并在 Python 中将它们重塑为多个数据帧
- routes - SpringCloudGateway 背后的 SpringBootAdmin 配置
- numpy - Numpy.dot 挂起我的程序,我认为这是内存问题
- java - Ant 在构建期间不读取 IvySettings.xml 文件
- python - 如果条件在“if 表达式”中失败,python 可以跳过值而不是提供 None 或 False 吗?
- php - API 平台验证不会阻止自定义操作
- windows - 如何识别 Windows 上哪个进程正在使用端口 18780?
- node.js - Firebase 如何免费部署云功能