【问题标题】:Implementation of a recursive binary search [closed]递归二分搜索的实现[关闭]
【发布时间】:2013-03-20 02:34:19
【问题描述】:

我正在编写一个将约会存储在 ArrayList 中的程序。要求用户输入约会的日期、开始时间和结束时间。程序需要在用户想要提交新约会时检查是否已经有约会。这是递归二进制搜索部分。这是我目前已经实现的。

方法:

public boolean overlap(ArrayList<Appointment> list, int start, int end, 
                       Calendar startCal, Calendar endCal)
{
    int middle = (start + end)/2;
    System.out.println("Start: " + start + " End: " + end + " Middle: " + middle);

    Appointment appt = list.get(middle);
    if(start == end){
        return((startCal.compareTo(appt.getStart()) >= 0 && startCal.compareTo(appt.getEnd()) <= 0 ) ||
                endCal.compareTo(appt.getEnd()) <= 0 && endCal.compareTo(appt.getStart()) >= 0 );
    }
    else if(startCal.compareTo(appt.getStart()) <= 0 && endCal.compareTo(appt.getStart()) <= 0){
        return overlap(list, start, middle - 1, startCal, endCal);
    }
    else{
        return overlap(list, middle, end, startCal, endCal); 
    }  
}

我怎么称呼它:

case 1 : //Enter a new appointment
                setCal();
                startDate = new GregorianCalendar(year, month, day, hour, minute);
                endDate = new GregorianCalendar(year, month, day, endHour, endMinute);

                appt = new Appointment(description, startDate, endDate);

                if(apptList.isEmpty()){
                    apptList.add(appt);
                }
                else{
                    boolean isOverlap = overlap(apptList, 0, apptList.size() - 1, 
                                        appt.getStart(), appt.getEnd());

                    if(isOverlap){
                        System.out.println("");
                        System.out.println("ERROR: There is already an appointment at that time");
                        System.out.println("");
                    }
                    else{
                        int indexToBeAdded = indexFinder(apptList, 0, apptList.size() -1, 
                                                       appt.getStart(), appt.getEnd());
                        Appointment tmp = apptList.get(indexToBeAdded);

                        if(tmp.start.compareTo(appt.start) < 0){
                            apptList.add(indexToBeAdded + 1, appt);   
                        }
                        else{
                            apptList.add(indexToBeAdded , appt);
                        }
                    }
                }
                choice = 0;
                break;

setCal() 只是提示用户输入所有日历参数并根据他们输入的内容进行设置。此外,indexFinder 是另一种递归二进制搜索方法,它查找应添加约会的索引,以便将约会添加到正确的顺序。

截至第三次约会时,我尝试添加时遇到堆栈溢出异常。

感谢您的帮助

【问题讨论】:

  • 您的具体问题是什么?
  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2) 你的问题是什么?
  • 我的具体问题是,一旦我尝试添加的第三个约会,我无法弄清楚为什么会出现堆栈溢出错误
  • 我想middle -&gt; start = 0end != 0。当然,输出 which is not included 应该准确地说明错误递归的内容。 (这就是我给 -1 的原因:我们无法读取您的控制台。)
  • 当询问有关错误的问题时,发布错误;问题应该是“为什么我在这段代码中出现这个错误”,包含完整的堆栈跟踪、您提供的输入以及输出的输出。即便如此,你也必须让它变得有趣;人们不想为你调试。为什么你确定你的代码是正确的?您是如何尝试解决的?

标签: java search binary


【解决方案1】:

return overlap(list, start, middle - 1, startCal, endCal);

如果你用 start = 0 和 end = 1,middle = 0+1/2 = 0 来调用重叠,那么你用 start = 0 和 end = -1 来调用重叠......这意味着它们会飞得更远并且距离更远,您跳过了到达start == end 的停止条件。

尝试将start == end 转换为start &gt; end

编辑:问题二是这个电话

return overlap(list, middle, end, startCal, endCal);

如果你用 start = 0 和 end = 1 调用重叠,中间 = 0+1/2 = 0,那么你用 start = 0 和 end = 1 调用重叠......无限递归循环!堆栈溢出!它永远不会结束。

要解决这个问题,请将middle 变成middle + 1

【讨论】:

  • 我也是这么想的,我确实尝试过开始>结束,第三个条目仍然会引发堆栈溢出。感谢您的回复!
  • @justin henricks 请看我的编辑
  • 这看起来很有效,比我想象的要简单得多。很高兴有第二双眼睛,非常感谢!
  • 误报,仍然出现堆栈溢出错误,我的方法还没有完全正确地实现。我不确定何时抛出堆栈溢出。有什么想法吗?
  • @justin henricks 不,使用调试器 ;)
猜你喜欢
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多