2013-02-17 2 views
1

Java에서 등가 클래스를 구현하는 간단한 방법은 무엇입니까? 그 목적을위한 도서관이 있습니까?Java에서 동등 클래스를 구현하는 방법은 무엇입니까?

귀찮은 부분은 효율적이고 비 순진한 "등가"연산자를 작성하는 방법입니다.

Let S = {x,y,z,w,h}. S의 등가 클래스에 대해 x->1, y->1, z->1, w->2, h->2 매핑을 사용하면 동일 균등 클래스 인 x->10, y->10, z->10, w->20, h->20 매핑을 고려해야합니다.

집합 S의 추기경이 커질 때 순진한 "균등"연산자는 빠르게 시간이 많이 걸릴 수 있습니다.

간단한 방법은 무엇입니까? 어떤 생각?

다음과 같이 EDITED]을 명확히하기 위해, 특별한 문제가 공식화 될 수

는 S가 비어 있지 않은 세트라고하자. 우리는 M에서 V에서 정수로의 부분 매핑 세트를 나타냅니다. 또한 아래에 정의 된 이진 관계 \ 시뮬레이션은 등가 M.

에 관계 M1 용

및 m2 M의 두 부분 매핑을 도출 보여 비교적 쉽게 M1 \ SIM m2, 경우에만,

  1. V의 임의의 a에 대해, m2 (a)가 정의 된 경우에만 m1 (a)가 정의되고, V의 임의의 a, b에 대해
  2. , m1 (a) 및 m1 (b)가 모두 동일하게 정의된다 m2 (a)와 m2 (b) 둘 다 동일한 정수 값 'z2'( 'z1'과 다를 수도 있고 같지 않을 수도 있음)에 대해 이 정의 된 경우에만 정수 값 'z1'

    예. A-> 9

    , B-> 9, 비스> 1 \ SIM A-> 10, B-> 10, 비스> 0

    하지만하지 정확한 대답 이다

    a-> 5 \ sim b-> 9

감사합니다.

+1

여기서 동등성의 정의는 무엇입니까? –

+0

내 편집 된 부분보기. – zell

+0

왜 요소를 정수로 모두 매핑합니까? 예를 들어, Set >을 사용하여 등가 관계를 나타낼 수 없습니까? 그렇게하면 equals()를 '무료로'올바르게 구현할 수 있습니다. –

답변

2

내가 알기로는 최대 공약수 (반복적으로 유클리드의 알고리즘)를 찾을 수 있으며 그 대신에 몫을 매핑 할 수 있습니다. 다른 세트와 정확하게 동일하면 그렇지 않습니다. 집합의 크기와 매핑이 동일한 경우에만 작동합니다.

2

올바른지 이해하면 벡터 정규화를 적용 할 수 있습니다. 예를 들어 3d 벡터는 모든 구성 요소를 벡터 길이로 나누어 길이 1로 정규화됩니다. 두 개의 정규화 된 벡터의 구성 요소가 동일하면 원래의 (정규화되지 않은) 벡터가 같은 방향을 가리 킵니다 (이는 '평등'으로 정의하는 것입니다)

x, y, z, w, h는 case는 5 차원 벡터입니다. 그들은 같은 방향으로 쇼가있을 때 같은 클래스에 속하지만, 임의의 길이를 가질 수 있습니다.

0

제쳐두고 : 나는 세트 S가 당신의 정의에서 실제로 세트 V라고 가정합니다.

나는 Set (Set (E)). equals()가 당신의 목적에 효율적이라고 생각하지 않지만 Uli가 올바른 방향에 있다고 생각합니다.(죄송합니다. lt 또는 gt 기호를 가져올 수 없습니다.)

Set (E) .equals()의 기본 구현은 O (n log n) 또는 O (n^2) 일 가능성이 큽니다. Set (E). equals()는 거의 확실하게 정렬을 포함합니다. O (n log n)는 얻을 수있는만큼 좋습니다. 기수 정렬을 살펴 보는 것이 좋습니다. 그것은 O (n * log n)이지만 매우 느리게 커집니다.

관련 문제