如何使用二进制搜索java打印数组中的重复值
您好,我正在创建一个程序,它有两个并行数组(studentNum和grades),在searchMark方法中,我会提示用户也输入他们想要查找的年级。然后,程序使用二进制搜索来查找该值,然后检查是否有其他学生拥有该值。然后所有的学生号和他们的成绩一起被打印在输出屏幕上。在数组中找到目标的第一个实例后,程序/代码将立即结束,我已经包括了一张我的输出是什么以及输出应该是什么样子的图片如何使用二进制搜索java打印数组中的重复值,java,arrays,matrix,netbeans,Java,Arrays,Matrix,Netbeans,您好,我正在创建一个程序,它有两个并行数组(studentNum和grades),在searchMark方法中,我会提示用户也输入他们想要查找的年级。然后,程序使用二进制搜索来查找该值,然后检查是否有其他学生拥有该值。然后所有的学生号和他们的成绩一起被打印在输出屏幕上。在数组中找到目标的第一个实例后,程序/代码将立即结束,我已经包括了一张我的输出是什么以及输出应该是什么样子的图片 // Binary Search int startIndex = 0, endIndex =
// Binary Search
int startIndex = 0, endIndex = 0;
int middleIndex;
int shiftPlus = 0;
int shiftMinus = grade.length-1;
int midValue = 0;
while (startIndex <= endIndex) {
middleIndex = (startIndex+endIndex)/2;
if (grade[middleIndex] == target) {
midValue = grade[middleIndex];
System.out.println("student #" + student[middleIndex]
+ " has a correct count of " + target);
break;
}
else if (grade[middleIndex] > target)
endIndex = middleIndex-1;
else if (grade[middleIndex] < target)
startIndex = middleIndex + 1;
}
boolean aboveMid = true, belowMid = true; // for while loops to stop/start
while (shiftPlus <= midValue && aboveMid == true) {
shiftPlus += 1; // starts at 0 and moves 1 up each loop
if(grade[shiftPlus] == target && shiftPlus <= midValue)
{
System.out.println("student #" + student[shiftPlus]
+ " has a correct count of " + target);
}
else
belowMid = false;
}
while (shiftMinus >= midValue && belowMid == true) {
shiftMinus -= 1; // subtract one from end
if(grade[shiftMinus] == target && shiftMinus <= midValue)
{
System.out.println("student #" + student[shiftMinus]
+ " has a correct count of " + target);
}
else
aboveMid = false;
}
}
//二进制搜索
int startIndex=0,endIndex=0;
int中间索引;
int-shiftPlus=0;
int shiftMinus=等级。长度-1;
int中值=0;
while(startIndex目标)
endIndex=middleIndex-1;
否则如果(等级[中间索引]<目标)
startIndex=middleIndex+1;
}
布尔值UpperMID=true,belowMid=true;//用于while循环停止/启动
虽然(shiftPlus二进制搜索内置于java(Arrays.binarySearch
)中,但自己编写是错误的。当然,除非这是家庭作业,编写二进制搜索算法是家庭作业
请注意,二进制搜索要求对输入数组进行排序。对未排序的输入运行binsearch会产生垃圾。如中所示,没有错误,只有..错误的答案。这是二进制搜索的基本属性
思考一下你的算法:假设所有学生都得了6分。显然,你的目的是打印出所有学生
您的代码将只在两个位置打印。这两个位置位于for循环中,并且它在for循环中打印X次,其中X是“target-shiftPlus”。您的代码不完整(shiftPlus未在任何位置定义),但很明显,如果“目标”改变,打印的数量也会改变。这证明了这是没有意义的:如果你在寻找得分为7的学生,而他们都有7分,那么你会比你在寻找得分为6的学生时多打印一张或少打印一张?不,这不可能是正确的。因此“目标”不应该是be首先是循环计数的一部分,在设计这个算法的过程中,你走错了方向
算法这一部分的重点是“环顾”二进制搜索找到的索引,因为可能有多个学生具有预期分数,如果有多个学生,他们将立即与您的“命中”相邻
一个关键的线索是,在你到达那里之前,你不知道可能会有多少点击,所以一个计数的for循环是正确的。也许一个while
更合适?一个for
也可以工作,但是一些索引查找需要成为终止条件的一部分(位于for内部的两个;
之间)
假设分数为:[4,6,6,6,7,8],您的binsearch碰巧发现了3个6
分数中的第一个。换句话说,二进制搜索的结果是:索引=1处存在匹配项
您希望首先“向下看”4(因此,-1相对于您找到的索引:index=0),在索引0处查找分数,即4
,意识到4不是6,并且不打印任何内容,此外,停止向下看
然后你想“查找”,从你自己的索引(索引=1)开始,获取该索引(6
)的分数,意识到这实际上是目标索引,所以打印该学生,然后继续:将1添加到你的索引(现在索引=2)然后重复该算法。再次“点击”,打印另一个学生,增加索引,第三次点击,将索引增加到4,获取索引4的分数(7
),现在失败,因此不会打印任何内容,也不会继续查找。然后,您还需要在没有任何其他索引可查看的边缘情况下进行编程。假设输入是[4,6,6,6]
,您不希望程序在出现ArrayIndexOutOfBoundsException
时崩溃,因为您的算法会在列表中继续向下搜索,直到找到一个不是6的数字
我不会把一个功能齐全的程序放在这里,因为这显然是家庭作业,目的是让您学习和理解java,而不是学习和理解CTRL/CMD+C和CTRL/CMD+V键的功能:)假设您找到了要查找的项目,并且它位于索引idx
中,因此您可以在其边界等于arr[idx]时进行迭代
leftidx = idx-1;
while(arr[leftidx]==arr[idx]{
System.out.println(arr[leftidx]);
lefidx--;
}
rightidx = idx+1;
while(arr[rightidx]==arr[idx]{
System.out.println(arr[rightidx]);
rightidx--;
}
不幸的是,我一直无法让它搜索其他成绩相同的学生。不幸的是,这不是一个我们可以帮助解决的问题描述。请查看并相应地增强您的问题。现在看起来怎么样?我对这个平台非常陌生,我理解像我这样的人添加如此多的杂乱内容可能会很烦人。请不要Don’不要使用屏幕截图。这些应该是你的最后手段。确保你的问题包含你正在处理的输入,以及作为文本的输出。从现在起,当我有问题时,我会这样做。谢谢你嗨,谢谢你的帮助,我再次工作,但只有当我输入目标值3时。当输入的目标值为3时,它会打印两个stu得到3分的凹痕。但是如果我说输入6,它只是说构建完成。顺便说一句,感谢你没有发布代码,我宁愿挣扎,然后才能得到答案。无论如何,我更新了代码,如果你能提供一些额外的指导和评论,那将是太好了!@RayaanKhan你的输入排序了吗?