【发布时间】:2015-02-18 05:31:06
【问题描述】:
我必须编写代码来获取具有奇数个元素的已排序双精度数组,找到它们之间距离最短的值对,并返回剩余的值,这被认为是“奇数”。以下是我编写的代码,它可以正常工作并返回正确的值。
有人可以帮我找出我使用的算法的时间复杂度吗?我试过了,但真的很混乱。
public static Double findPairs(Double[] data, int i, int j, int k, int count) {
Double oddNumber = -1.;
if ((k < data.length) && (diff(data[i], data[j]) <= diff(data[j], data[k]))) {
data[i] = (-1.);
data[j] = (-1.);
if (k == data.length - 1) {
for (int c = 0; c < data.length; c++) {
if (data[c] != -1.) {
i = c;
break;
}
}
if (i != k) {
for (int c = 0; c < data.length; c++) {
if ((c > i) && (data[c] != -1.)) {
j = c;
break;
}
}
findPairs(data, i, j, k, count + 1);
}
}
else {
for (int c = 0; c < data.length; c++) {
if (data[c] != -1.) {
i = c;
break;
}
}
for (int c = 0; c < data.length; c++) {
if ((c > i) && (data[c] != -1.)) {
j = c;
break;
}
}
for (int c = 0; c < data.length; c++) {
if ((c > j) && (data[c] != -1.)) {
k = c;
break;
}
}
findPairs(data, i, j, k, count + 1);
}
}
else if ((k < data.length) && (diff(data[i], data[j]) > diff(data[j], data[k]))) {
if (k == data.length - 1) {
data[j] = (-1.);
data[k] = (-1.);
}
else {
i = j; j = k;
for (int c = 0; c < data.length; c++) {
if ((c > j) && (data[c] != -1.)) {
k = c;
break;
}
}
findPairs(data, i, j, k, count);
}
}
for (int c = 0; c < data.length; c++) {
if (data[c] != -1) {
oddNumber = data[c];
}
}
return oddNumber;
}
算法:从数组的第一个、第二个和第三个元素开始。比较第一个和第二个元素以及第二个和第三个元素之间的差异。如果第一个差值小于或等于后者,则将前两个元素设为 (-1)。否则,对第二个、第三个和第四个元素执行相同的操作。继续这个过程。每当第一个差值小于第二个差值时,将相关元素设为 (-1) 并从数组的开头搜索不是 (-1) 的元素。从找到的前三个元素开始重复该过程。每当第二个差异小于第一个时,将三个中的第一个元素放在一边,并与接下来的三个进行检查。这样做直到到达数组的末尾。
【问题讨论】:
-
(确保不要将
Double与double混淆,因为这会显着改变算法的性能) -
您能否提供输入数据和期望结果的示例?
标签: java arrays algorithm time-complexity complexity-theory