如何在Java中有效地查找链接的单元格?

时间:2016-05-31 14:48:10

标签: java arraylist

输入:单元格列表。每个单元格都有一个顶级邻居列表,左边邻居列表。使用与给定单元格列表的连接匹配的合并单元格重新创建excel文件。图表的整体形状和每个单元格是矩形的,矩形内部没有空隙。总体计划:重建每个单元格的底部和右侧邻居列表。然后计算单元格大小。

我有一个方法填充每个单元格的右邻居和底邻居列表,但这种方法很慢O(n ^ 2 +)。我怎样才能让它更快?

我正在编写一个带有arraylist的方法,其中每个单元格都有一个名称和一个listOfLeftNeighbors以及一个空的listOfRightNeighbors。然后它遍历列表并使用“如果你在listOfLeftNeighbors中有我,然后你被添加到我的listOfRightNeighbors。然后它返回为每个单元格填充listOfRightNeighbors的arraylist。”填充listOfRightNeighbors。

private ArrayList<Cell> getRightNeighbors(ArrayList<Cell> set) {
    for (int i = 0; i < set.size(); i++) {           //for every cell in the list

        List<String> myLeftNeighbor = set.get(i).getLeft();  //get a list of left neighbors
        for (int j = 0; j < myLeftNeighbor.size(); j++) {    //For each left neighbor of a given cell
            String nameOfLeftNeighbor = myLeftNeighbor.get(j);
            for (int k = i + 1; k < set.size(); k++) {          //Check the list of cells and
                String kName = set.get(k).getName();
                if (0 == kName.compareTo(nameOfLeftNeighbor)) { //if name of k-th cell matches 
                    set.get(k).addRight(set.get(i).getName());  //To list of right neighbors add the name of i-th cell 
                }
            }
        }
    }
    return set;
}

这至少是O(n ^ 2)复杂度。有没有办法让这种方法更有效率?

简而言之,初始数据由用户以excel格式提供。然后由拓扑处理器处理。每个单元格都有一个名称getExcelName() + some_random_string。拓扑处理器多次拆分和合并单元。当然,每次拓扑处理器拆分A1时,我都可以更新每个单元的坐标(每个电子表格大约100K个单元格),但这不是一个有效的算法。相反,拓扑处理器操纵单元的左邻居和上邻居的列表。保持本地互动。拓扑操作完成后,数据应转换为excel格式。

我不认为该项目的确切性质是相关的。想象一组连接的管道。每个管道都连接到一些上游管道ArrayList<String> leftNeighbors和一组下游管道ArrayList<String> rightNeighbors。问题:给定一组带有leftNeighbors(上游)列表的管道,如何有效地填充rightNeighbors(下游)列表?

1 个答案:

答案 0 :(得分:1)

使用哈希,为每个单元格分配一个从0开始的数字。创建一个数组。用这些数字替换所有单元名称。 O(n)对于每个单元格O(n)执行此操作:
说你使用单元格8,它有一个邻居10.然后:listOfRightNeighblrs[10] = listOfRightNeighblrs[10] + ", 8"; O(1)(这是成功的关键)。
然后转换回单元名称,为每个单元格O(n)从listOfRightNeighblrs O(1)填充其右邻居。
到目前为止它应该接近O(n * averageNumberOfNeighbors)。