输入:单元格列表。每个单元格都有一个顶级邻居列表,左边邻居列表。使用与给定单元格列表的连接匹配的合并单元格重新创建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(下游)列表?
答案 0 :(得分:1)
使用哈希,为每个单元格分配一个从0开始的数字。创建一个数组。用这些数字替换所有单元名称。 O(n)对于每个单元格O(n)执行此操作:
说你使用单元格8,它有一个邻居10.然后:listOfRightNeighblrs[10] = listOfRightNeighblrs[10] + ", 8";
O(1)(这是成功的关键)。
然后转换回单元名称,为每个单元格O(n)从listOfRightNeighblrs O(1)填充其右邻居。
到目前为止它应该接近O(n * averageNumberOfNeighbors)。