在过去的一篇试卷中,有一个问题提供了两种方法来检查int [] A是否包含与int [] B(两个大小为N的未排序数组)相同的值,工程师必须决定哪个实现他会用。
第一种方法使用单个for循环,嵌套调用线性搜索;其渐近运行时间计算为theta(n ^ 2),用于创建A和B副本的额外内存使用量约为(N * 4N + 4N)字节
第二种方法使用了另外一个int [] C,它是B的副本,它被排序。 for循环用于嵌套二进制搜索;它的渐近运行时间计算为theta(nlog(n ^ 2)),用于创建A和B副本的额外内存使用量约为(4N + 4N + N * 4N + 4N)字节(前两个4N是由于C是B的副本,后续的C副本是在sort(C); function)
中创建的最后一个问题询问工程师应该使用哪种实现,我相信更快的算法将是更好的选择,对于更大的输入,更快的算法会大大缩短计算时间,尽管回退是更大的输入他冒着OutOfMemory错误的风险,我理解可以根据数组的大小来说明任何一种方法,尽管我的问题是,在大多数情况下,哪种实现是更好的实现?
答案 0 :(得分:1)
第一个alg。具有theta(n ^ 2)的复杂度和θ的第二个(n log(n ^ 2))。
因此,第二个对n
来说要快得多。
正如你所提到的,内存使用会受到考虑,有人会争辩说第二个会消耗更多内存,但事实并非如此。
第一个alg。消耗:n * 4n + 4n = 4n ^ 2 + 4n
第二个alg。消耗:4n + 4n + 4n + n * 4n = 4n ^ 2 + 12n
假设n
等于1000
,则第一个alg消耗4004000
和第二个4012000
内存。因此,两种算法之间的内存消耗没有太大差异。
因此,从内存消费的角度来看,哪个alg并不重要。你选择并且在复杂性方面他们都消耗theta (n^2)
记忆。
答案 1 :(得分:1)
许多程序员的相关问题,但答案完全取决于上下文。如果软件在具有少量内存的系统上运行,那么占用空间较小的算法可能会更好。另一方面,实时系统需要速度;所以更快的算法可能会更好。
重要的是还要认识到执行过程中出现的更微妙的问题,例如:当更快算法的额外内存要求迫使系统使用分页时,反过来会减慢执行速度。
因此,理解 in-context 每个算法的收益 - 成本权衡非常重要。和往常一样,强调代码可读性和声音算法设计/集成。