如果已排序,则使用二进制搜索,否则使用线性搜索

Posted

技术标签:

【中文标题】如果已排序,则使用二进制搜索,否则使用线性搜索【英文标题】:Use binary search if sorted otherwise use linear search 【发布时间】:2013-12-19 22:21:13 【问题描述】:

我遇到了一个问题,用户得到一本空的食谱书,他们可以输入食谱并对其进行排序。

我知道如果一本书是空的,有一个菜谱和两个菜谱(升序/降序),它就会被排序。这些可以使用二分查找。

但是当用户输入第三个食谱时,它可能是“cookies, donut, turkey”(已排序)或“cookies, donut, apples”且未排序。如果它没有排序,那么我必须使用线性搜索。

这是我目前所拥有的

 public void sortBook(int choice, boolean ascend) 
  RecipeBookComparator comparing = new RecipeBookComparator(choice, ascend);
  mList.sort(comparing);

public class RecipeBookComparator implements Comparator 
  private int mSortRBook;
  private boolean mAscend;
  public RecipeBookComparator (int choice, boolean ascend) 
     mSortRBook = choice;
     mAscend = ascend;
  
  public int compare(Object o1, Object o2) 
     Recipe s1 = (Recipe)o1, s2 = (Recipe)o2;
     switch (mSortRBook) 
        case 1:
           if (mAscend == true) 
              int compareName = s1.getName().compareTo(s2.getName());
              if (compareName != 0) 
                 return compareName;
              
           
           else 
              int compareName = s1.getName().compareTo(s2.getName());
              if (compareName != 0) 
                 return compareName * -1;
              
            ///more cases...

我知道我应该做什么,但我不知道如何“按代码”处理它

【问题讨论】:

为什么需要二进制搜索来搜索包含 2 个元素的列表?你到底想做什么? 您似乎在尝试排序,而不是搜索。您需要检查输入是否已排序,然后进行相应搜索 【参考方案1】:

要确定列表是否已排序,您必须将每个元素与 ist 邻居进行比较。如果数千个元素中只有一个元素不按顺序排列,则二进制搜索可能会失败。所以你必须检查完整的列表。但是检查所有列表以检查列表是否已排序比使用线性搜索在列表中查找一个元素要花费更长的时间,因此这没有任何意义。如果您不确定列表是否已排序,请使用线性搜索。就是这样。

【讨论】:

如果您只打算进行一次搜索,这是正确的,但如果您要对同一个固定的数据列表进行多次搜索,则不是这样。【参考方案2】:

你的代码说:

mList.sort(比较);

我相信你误解了你被要求做的事情 - 假设“如果排序则使用二进制搜索,否则使用线性搜索”,你的问题的标题是你应该做的。你根本不应该对它们进行排序。这个问题不需要任何关于如何在 Java 中排序的知识。

您需要了解的是搜索,而不是排序。以及如何检查输入序列是否已经排序。

现在,诚然,技术上您可以通过实际排序来检查序列是否已经排序,然后检查结果序列是否与您开始时的顺序相同。但我不建议这样做。

相反,我建议使用 Comparator 比较序列中的每对相邻元素(如果有),以检查序列是单调递增还是单调递减。 p>

【讨论】:

哦,你是对的。我想我真正的意思是如果用户想在书中找到一些东西,并且它没有被排序然后使用线性搜索,如果是,那么使用二进制搜索。

以上是关于如果已排序,则使用二进制搜索,否则使用线性搜索的主要内容,如果未能解决你的问题,请参考以下文章

搜索排序的链表时,二进制或顺序/线性搜索是不是更有效?

使用迭代器位置的线性和二进制搜索

使用二进制搜索在数组中查找数字的位置

许多排序数组中的二进制搜索

在java中使用线性和二进制搜索的用户输入

对已旋转 N 次的排序数组进行二进制搜索的最佳方法是啥[重复]