【问题标题】:Binary Search on specific part of String对字符串的特定部分进行二分搜索
【发布时间】:2015-10-19 05:42:19
【问题描述】:

这是9*8*0.01548 中的字符串ArrayList<String>。我需要基于Double 值(即0.01548)的二进制搜索来找到搜索值的紧密匹配。 ArrayList 包含大约 100 万条记录。 Split 在优化方面似乎不是一个好的选择。 我尝试了以下代码,但它不起作用,因为列表中间值是根据 3 的列表大小计算的。二进制搜索本身很好,我只是为了清楚问题而添加,如果只有 Double 值在 arrayListvalues 中,那么二进制搜索工作正常

  1. 有哪些可能的替代方案?
  2. 如何使它工作?

下面是:

public static <T> int binarySearch(List<T> list, T key, Comparator<T> compare) {
int low, high, med, comp;
        T temp;
        high = list.size();
        low = 0;
        med = (high + low) / 2;

        while (high != low + 1) {
            temp = list.get(med);
            comp = compare.compare(temp, key);

            if (comp == 0) {
                return med;
            } else if (comp < 0) {
                low = med;
            } else {
                high = med;
            }

            med = (high + low) / 2;
        }

        return med;
    }

比较器

public static class doubleComparator implements Comparator<String> {

 @Override
        public int compare(String s1, String s2) {
            String[] d1 = s1.split("*"); //this
            String[] d2 = s2.split("*"); //that
            if (Double.parseDouble(d1[2]) < Double.parseDouble(d2[2])) {
                return -1;
            } else if (Double.parseDouble(d2 [2]) > Double.parseDouble(d2[2])) {
                return 1;
            } else {
                return 0;
            }
        }
    }

主要

 public static void main(String[] args) {
 ArrayList<String> strArray= new ArrayList<String>();
        strArray.add("1*2*0.1");
        strArray.add("3*4*0.5");
        strArray.add("5*6*0.6");
        strArray.add("7*8*0.7");
        strArray.add("9*10*0.8");
        strArray.add("11*12*0.9");
        int key = binarySearch(strArray, "45*60*0.3", new doubleComparator());
        System.out.println("Search for "45*60*0.3:"\tKey:" + key + "\tValue:" + strArray.get(key));
}

【问题讨论】:

    标签: java string binary-search string-split


    【解决方案1】:

    考虑改变这里的核心元素:为什么要使用带字符串的ArrayList;如果您将有一百万个以上的条目;你需要快速获取双打吗?

    为什么不进行预计算:当您获取初始记录时;将它们分成两个列表;一个包含完整的字符串...另一个只包含(已经计算和转换)双精度值?哎呀,如果对象的数量没有变化;您甚至可以将它们放在一个数组中(对于一百万个条目,array[double] 的成本合理地小于 ArrayList)。

    含义:有时尝试围绕表现不佳的数据构建“高效”算法是浪费时间。相反,更改数据的表示,以便您可以有效地处理它......

    当然,这取决于...数据更改的频率...数据需要(重新)计算...这些搜索发生。只是说您不应该专注于“正确进行搜索”。

    【讨论】:

      【解决方案2】:

      二分查找仅适用于列表,前提是元素按所搜索的相同属性排序。因此,只有在如果列表按每个 String 中的最后一个值(浮点值)排序时,搜索才会起作用。

      下一个问题是排序/搜索的相关值是列表的最后一个元素,因此构造一个用于二进制搜索的Comparator 非常困难。最快的方法(就运行时而言)是为比较构建一个自己的循环,并以允许更快比较的方式重新组织字符串。例如:不要使用"9 * 8 * 0.01548",而是使用"0.01548 * 9 * 8" 来加快搜索速度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-15
        • 1970-01-01
        • 2012-03-20
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多