java - 循环顺序: how to choose the outer loop

标签 java loops for-loop logic

这个问题与编程逻辑有关,而不是编程本身。 我目前正在编写一个包含两个列表的程序;一个用于人(带有人物对象),另一个用于礼物(书籍、电影等)

简而言之,该计划的目标是将所有礼物发送给名单上的人(包括是否接受礼物的代码。如果是:礼物消失,如果不是:礼物会保存给下一个人)。

我的问题如下:我是否遍历人员列表(外循环),然后迭代礼物(内循环)以查看某人是否想要该特定礼物,这重要吗?或者我必须先循环遍历礼物(外部),然后循环遍历每个人(内部)以查看是否有人接受一份礼物?

因此,我必须使用替代方案 (A) 或 (B) 的结构(此处以伪代码形式提供),我如何知道哪个是最好的?

(A)

for (list of people) {
    for(list of gifts) {
        //Se if person wants gift
    }
}

(B)

for (list of gifts) {
    for(list of people) {
        //Se if gift is accepted by a person
    }
}

最佳答案

我不同意大多数答案所隐含的原则,即顺序不影响性能。当然,在这样一个很小的案例中,只有50个人和200份礼物,差异可以忽略不计。但考虑一个更极端的情况,有 2 个人和 1,000,000 份礼物。

  • 在选项 A 中,people 变量的值更改了两次,而gifts 的值更改了两次 变量改变值 200 万次。变量赋值总数 1,000,002。
  • 在选项 B 中,gifts 变量的值更改了 100 万次,并且 people 变量改变值 200 万次。变量赋值总数 3,000,000。

这两个选项中的嵌套循环内可能会完成相同的计算工作,但管理嵌套循环的计算管理工作有所不同。即使抛开根据礼物接受情况提前跳出循环可能实现的优化,通过将值较少的变量作为外循环也会提高性能。

关于java - 循环顺序: how to choose the outer loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21811192/

相关文章:

java - 从 GoogleAccountCredential 获取 DisplayName

python - 如何找到能被整数10整除的多数整数?

c++ - 可以在基于范围的 for 循环中使用模板化的开始/结束方法吗

c++ - for循环后面的分号是什么意思?为什么第一个循环语句中有一个j++?

localdb的sqlserver的Java连接字符串

java - for循环后的打印语句不打印,为什么?

c# - Java 似乎支持 long 类型的可变字段,而 C# 不支持 - 这背后的原因是什么?

c# - 如何在有backgroundWorker的过程中停止执行

c - 从 for 循环中向线程传递一个值

python - 将列表中的项目映射到列表列表