Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算递归或迭代调用的中间索引的最佳方法是什么_Java_Algorithm - Fatal编程技术网

Java 计算递归或迭代调用的中间索引的最佳方法是什么

Java 计算递归或迭代调用的中间索引的最佳方法是什么,java,algorithm,Java,Algorithm,在实际的Java执行中,第二个是提供优化的函数调用(更好的时间复杂度)。 看起来,对于某个“左”和“右”值,这两个变量都给出了相同的结果。这两个选项有什么不同之处吗。 任何帮助都将不胜感激。(1)是不准确和错误的。(2) 是修复和正确的 问题不在于时间复杂性,而在于准确性 假设right=2147483646和left=2147483646。添加这些将导致 第二个可以避免溢出。这有帮助吗?对于左侧和右侧相对较小的幅值,它们都很好。但较大的数量级会受到整数溢出的影响 1) int mid = (r

在实际的Java执行中,第二个是提供优化的函数调用(更好的时间复杂度)。 看起来,对于某个“左”和“右”值,这两个变量都给出了相同的结果。这两个选项有什么不同之处吗。 任何帮助都将不胜感激。

(1)是不准确和错误的。(2) 是修复和正确的

问题不在于时间复杂性,而在于准确性

假设
right=2147483646
left=2147483646
。添加这些将导致


第二个可以避免溢出。

这有帮助吗?对于左侧和右侧相对较小的幅值,它们都很好。但较大的数量级会受到整数溢出的影响

1) int mid = (right+left)/ 2;
2) int mid = left + (right - left) / 2;
印刷品

int right = Integer.MAX_VALUE-100;
int  left = Integer.MAX_VALUE-120;

int newLeft = left + (right-left)/2;
System.out.println(newLeft);
newLeft = (right + left)/2;  // = -222/2 = -111
System.out.println(newLeft); // oops!

当我们谈到这个话题时,这就是为什么像这样实现
int
比较器是不好的做法:

2147483537
-111
比较器comp=(a,b)->a-b;
什么时候应该是这样

Comparator<Integer> comp = (a, b) -> a - b;
比较器comp=(a,b)->a>b?1:a
读取如果
right
left
之和大于
Integer.MAX_值,则第一个值将溢出。更喜欢使用第二个。谢谢你的回复…这就澄清了。谢谢你的回复…这就澄清了区别。
Comparator<Integer> comp  = (a, b) -> a > b ? 1 : a < b ? -1 : 0;