将列表中的项目与VB.NET中相同列表中的其他项目进行比较

时间:2011-05-30 03:00:06

标签: vb.net

简化,我有List(Of MyObj),我想遍历该列表并将每个元素与相同列表中的所有其他元素进行比较,排除(如果可能)相同的元素。我有一个有效的解决方案,但它很慢,并使用双For循环。它可能也从睡梦中召唤了克苏鲁。

有更好的方法吗?林奇,也许?还是一些奇特的算法?以下是我所拥有的消毒版本:

Dim MyList As New List(Of MyObj)({Obj1, Obj2, Obj3, Obj4, Obj5, Obj6})

If MyList.Count > 0 Then
    For i = 0 To (MyList.Count - 1) Step 1
        For j As Int32 = 0 To (MyList.Count - 1) Step 1
            If MyList(i).GetHashCode = MyList(j).GetHashCode Then
                Continue For
            Else
                If MyList(i).SomeFunction(MyList(j)) Then
                    Call DoSomething()
                End If
            End If
        Next j
    Next i
Else
    ' Error Code Here.
End If

3 个答案:

答案 0 :(得分:1)

这将在O(M * N)中起作用,其中N是ObjCount,M是非重复对象的数量。您当前的解决方案是O(N ^ 2)。

  1. 您需要一个哈希函数。您可以确定GetHashCode是否足够,或者您是否需要实施Sha1。

  2. 实例化HashSet(或HashTable,具体取决于您的哈希函数)

  3. 将每个对象(如果尚不存在)添加到HashSetHashTable

  4. 对于HashSet中的每个对象,对SomeFunction()中的每个其他对象执行HashSet。如果转储到数组并通过索引进行迭代,则只需要比较索引而不是对象。

    For i as integer = 0 to MyHashResultsArray.Count - 1
      For j as integer = 0 to MyHashResultsArray.Count - 1
        if i <> j then
          MyHashResultsArray(i).DoSomething(j)
        end if
      next
    next
    
  5. 重要

    这只是一个很好的解决方案,如果存在大量的重复,可能需要10%的重复级别才能考虑这个解决方案,除非是非常大的N值。如果N太大,那么 - 可能有必要设计应用程序,以避免对M个对象进行M操作。

    修改

    大部分评论讨论都是基于我对作者对DoSomething()函数的需求的误解。

答案 1 :(得分:1)

看看这是否有用

MyList.Select(Function(x) MyList.Except(New () {x}).ToList().ForEach(Sub(y) Do
    If x.SomeFunction(y) Then
        DoSomething()
    End If
End Sub))

答案 2 :(得分:1)

除非使用GetHashCode来检查对象是否存在任何潜在的问题(最好不要这样做 - 它只会在某些时候咬你 - 而且可能是这已经唤醒了Cthulhu!),你的解决方案与它可能会得到。

当然,您可以调整它,但它将保持为O(N ^ 2),也就是说,运行时将是列表中元素数量的平方的顺序。如果将元素数量加倍,则运行时间将增加4倍。