微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果插入到静态数组中的是Space-O1,那么空间复杂度如何工作?

如何解决如果插入到静态数组中的是Space-O1,那么空间复杂度如何工作?

静态数组的副本为SO(N)(因为此操作所需的空间与N成线性比例关系)

插入到静态数组中的是SO(1)

“因为虽然需要复制第一个数组并添加新元素,但是在复制后它释放了第一个数组的空间”,这是我正在学习的标准引用的TS复杂性来源。 >

在处理时间复杂度时,如果该算法包含O(N)运算,则该算法的整个时间复杂度为AT LEAST O(N)。

我很难理解我们如何精确地测量空间复杂性。我以为我们要看“算法运行完成后确定它是否按N缩放后在内存上的差异”,这将构成插入到静态数组中的SO(1)。

但是,通过这种方法,如果我有一种算法,则在其运行过程中将使用N!空间来获取单个值,最后,我将清理为此分配的内存N!项,则算法为Space-O(1)。

实际上,每个不直接处理实体的算法,在其运行过程之后仍为O(1)(因为在算法之后我们不需要创建的实体,因此我们可以清理内存结束)。

请帮助我了解这里的情况。我知道,在现实世界的复杂性分析中,有时我们会沉迷于技术上的虚伪(例如,声称从HashTable中获取的Big-O(最坏的情况)是Time-O(1),而实际上O(N),但足以让我们断言它是相关的,或者插入到动态数组的末尾是Time-O(1),当它也是O(N)时,但是摊销分析称它也足够稀有声称是时间O(1)。

当插入到静态数组中实际上是Space-O(N)时,是否是其中一种情况,但我们认为它是Space-O(1)是理所当然的呢?还是我误会了空间复杂性的工作原理? / p>

解决方法

空间复杂度只是描述内存消耗与输入数据大小之间的关系。

对于SO(1),程序的内存消耗不取决于输入的大小。例如“ grep”,“ sed”以及在流上运行的类似工具。对于更大的数据集,它们只会运行更多时间。例如,在Java中,您有SAX XML Parser,它不会在内存中建立DOM模型,但是会在看到XML元素时发出事件。因此,即使在内存有限的机器上,它也可以处理非常大的XML文档。

对于SO(N),程序的内存消耗随输入大小线性增长。因此,如果一个程序消耗200条记录的500 MB和400条记录的700 MB,那么您知道该程序将消耗700条记录的1 GB。实际上,大多数程序都属于此类。例如,比其他电子邮件长一倍的电子邮件将占用两倍的空间。

消耗超过SO(N)的程序通常处理复杂的数据分析,例如机器学习,AI或数据科学。在那里,您想研究各个记录之间的关系,因此有时您会建立更高维度的“多维数据集”,并得到SO(N ^ 2),SO(N ^ 3)等。

因此,从技术上讲,“插入静态数组为SO(N)”是不正确的。正确的说法是“ XYZ算法具有空间复杂度SO(N)”。

在调整基础结构大小时,时间和空间的复杂性很重要。例如,您已经在50个用户上测试了系统,但是您知道在生产中将有10000个用户,因此您要问自己“我的服务器中需要有多少RAM,磁盘和CPU”。

在许多情况下,时间和空间可以相互交换。没有比在数据库中更好的方法了。例如,一个表可以具有消耗一些额外空间的索引,但是由于不必搜索所有记录,因此可以大大提高查找内容的速度。

空间交易时间的另一个示例是使用彩虹表破解密码哈希。在那里,您实际上是在预先计算一些数据,此后可以节省大量工作,因为您不必在破解过程中执行那些昂贵的计算,而只需查找已经计算出的结果即可。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。