【问题标题】:How to implement binary Search process in Arraylist in Java如何在 Java 中的 Arraylist 中实现二进制搜索过程
【发布时间】:2020-05-11 12:23:27
【问题描述】:

我不知道如何在 Java 中的 Arraylist 中实现二进制搜索过程。

有两个数组列表显示机场名称和两个机场名称之间的路线。

下面定义了 airportName 和 Route Class。

public class AirportName{
    private String airportName;
}

public class Route{
    private String takeOffPoint;
    private String landingPoint;
}

机场名称定义为机场名称的缩写,例如 Arraylist 中的 (JFK) 路线名称定义为一个路线对象,包括 Arraylist 中的起飞点和着陆点,例如 (肯尼迪-TLV)

因为每个30000以上的arraylist中有很多机场名称和航线,所以我不得不使用二分查找来实现代码的优化。

我已经在不使用二分搜索的情况下完成了这个过程。

我如何通过二分查找来做到这一点?

这是我的代码 sn-p 如下所示。

ArrayList<AirportName> airportNames = ShowProcess.getAirports();
ArrayList<Route> routeNamesList = ShowProcess.getAirportRoutes();

飞机名称

Scanner sc = new Scanner(System.in);
    System.out.print("Enter AirportName : ");
    String airportName = sc.nextLine(); 

    boolean checkAirportNameValid = false;

    for(AirportName airport : airportNames) {
        if(airport.getAirportName().equals(airportName)) {
            checkAirportNameValid = true;
        }
    }

路线名称

public static ArrayList<String> searchProcess(String airportName, ArrayList<Route> routeNamesList) {
        ArrayList<String> destinationNames = new ArrayList<String>();
        for(Route route : routeNamesList) {
            if(route.getTakeOffPoint().equals(airportName)) {
                destinationNames.add(route.getLandingPoint());
            }
        }

        return destinationNames;
}

【问题讨论】:

  • 您的列表是否已预先排序?
  • @user 这是一种线性搜索,但由于它的大小,我必须使用二进制搜索来搜索列表中的项目。
  • 好的,但是您的列表已经排序了吗?
  • @user 未排序。
  • 那么二分查找可能不值得。线性搜索是O(n),二分搜索是O(nlogn)(更实际)

标签: java arraylist binary-search


【解决方案1】:

这是我的解决方案。它的工作原理

public static Integer[] binarySearch(ArrayList<Route> routeNamesList, Comparable key) {
        ArrayList<Integer> arrList = new ArrayList<Integer>();
        int lo = 0, hi = routeNamesList.size() - 1, mid;
        routeNamesList.sort((str1, str2) -> str1.getTakeOffPoint().compareTo(str2.getTakeOffPoint()));

        while (lo <= hi) {
            mid = lo + (hi - lo) / 2;
            int cmp = key.compareTo(routeNamesList.get(mid).getTakeOffPoint());
            if (cmp == 0) {
                int lowerBoundary = lowerIndex(routeNamesList, key, lo, mid);
                int upperBoundary = upperIndex(routeNamesList, key, mid, hi);
                for(int i = lowerBoundary; i <= upperBoundary; i++) {
                    arrList.add(i);
                }
                break;
            } else if (cmp < 0)
                hi = mid - 1;
            else
                lo = mid + 1;
        }
        return arrList.stream().toArray(Integer[]::new);
    }

    public static int lowerIndex(ArrayList<Route> routeNamesList, Comparable key, int lo, int hi) {
        int mid;
        int lastMatch = hi;
        while (lo <= hi) {
            mid = lo + (hi - lo) / 2;
            int cmp = key.compareTo(routeNamesList.get(mid).getTakeOffPoint());
            if (cmp == 0) {
                lastMatch = mid;
                hi = mid - 1;
            } else if (cmp < 0) {
                lo = mid + 1;
            } else {
                break;
            }
        }

        return lastMatch;
    }

    public static int upperIndex(ArrayList<Route> routeNamesList, Comparable key, int lo, int hi) {
        int mid;
        int lastMatch = lo;
        while (lo <= hi) {
            mid = lo + (hi - lo) / 2;
            int cmp = key.compareTo(routeNamesList.get(mid).getTakeOffPoint());
            if (cmp == 0) {
                lastMatch = mid;
                lo = mid + 1;
            } else if (cmp < 0) {
                hi = mid - 1;
            } else {
                break;
            }
        }

        return lastMatch;
    }

    public static ArrayList<String> searchProcess(String airportName, ArrayList<Route> routeNamesList) {
        ArrayList<String> destinationNames = new ArrayList<String>();

        Integer[] indices = binarySearch(routeNamesList, airportName);
        for (int i = 0; i < indices.length; i++) {
            if(routeNamesList.get(i).getTakeOffPoint().equals(airportName)) {
                destinationNames.add(routeNamesList.get(i).getLandingPoint());
            }
        }

        return destinationNames;
    }

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2013-06-01
    • 2017-03-28
    • 2020-03-05
    • 1970-01-01
    相关资源
    最近更新 更多