Java/从用户定义类的数组列表中搜索、修改和删除元素

Java/从用户定义类的数组列表中搜索、修改和删除元素,java,search,arraylist,graph-theory,getter-setter,Java,Search,Arraylist,Graph Theory,Getter Setter,我有一个有向图边的数组列表 List<Edge> graph = new ArrayList(); 我们可以通过创建edge类的新对象向有向图数组列表添加新元素 Edge edge = new Edge(); edge.setSourceVertex(1); edge.setDestinationVertex(2); graph.add(edge); 我的问题是,仅仅通过指定源顶点和目标顶点,而不检查数组列表中的每个元素,是否可以从有向图数组列表中搜索、修改或删除元素。我们不知道

我有一个有向图边的数组列表

List<Edge> graph = new ArrayList();
我们可以通过创建edge类的新对象向有向图数组列表添加新元素

Edge edge = new Edge();
edge.setSourceVertex(1);
edge.setDestinationVertex(2);
graph.add(edge);
我的问题是,仅仅通过指定源顶点和目标顶点,而不检查数组列表中的每个元素,是否可以从有向图数组列表中搜索、修改或删除元素。我们不知道有向图数组列表中任何特定元素的索引,因此无法逐个索引在有向图数组列表中执行这些操作

如果只允许使用有向图边的数组列表表示,这些搜索和修改操作是否至少可以在O(logn)时间内进行,而不需要O(n)时间?

通过二进制搜索始终可以在O(logn)时间内进行搜索。 从列表中间开始,如果属性的值小于或大于你想要查找的值,那么在这里剪到左边或右边的一半。 轮廓 您将需要列表中的某种顺序来实现O(logn)性能。 大概是这样的: 按源排序,然后按目标排序:

{
    // all with source=1
    Edge(src=1, target=1),
    Edge(src=1, target=2),
    Edge(src=1, target=4),
    // all with source=2
    Edge(src=2, target=2),
    // all with source=3
    Edge(src=3, target=2),
    // all with source=4
    Edge(src=4, target=2)
}
通过二进制搜索可以找到具有指定src的特定边。但是如果你想搜索一个特定的目标,那么这是行不通的,因为列表是按源排序的——你必须重新排序!(见下图)

要在O(logn)时间内将边插入到正确的索引上,请同时使用二进制搜索,然后通过插入新边

graph.add(index, edge); 
如果希望获得具有特定目的地的所有边,则必须对arrayList进行重新排序(使用良好的排序算法,如Mergesort或Heapsort,需要O(logn))然后可以执行上述操作

通过以下方式重新排列阵列:

Collections.sort(arrayList, 
                        (o1, o2) -> o1.getDestination().compareTo(o2.getDestination()));

…或任何你想排序的属性。

< P>你是否考虑使用<代码> HashMap < /代码>作为图形的表示?< /P> 或者,您可以将
equals()
hashCode()
方法添加到
Edge
类中,并使用类似于
Set edges=new HashSet()的方法Set
接口中的code>和标准方法


所有操作(添加/删除边缘)都将使用
O(1)
运行时复杂性。

是的,但我的问题不是关于任何给定图形的有效表示,而是我们如何有效地搜索、修改或删除数组列表(或哈希集)中的元素通过使用用户定义类中的一个变量值创建用户定义类。我只是以graph为例指定了一个用户定义类来提问,但它也可以是其他用户定义类。可能是图论标签可能与我提出的问题不太相关。
Collections.sort(arrayList, 
                        (o1, o2) -> o1.getDestination().compareTo(o2.getDestination()));