2015-01-16 6 views
1

사용자 지정 클래스가 있고 해당 개체에 대해 XOR 연산을 수행하려고합니다.Java XOR 사용자 지정 개체

내가 생각할 수있는 유일한 방법은 객체를 문자열로 직렬화 한 다음 문자열을 바이트 배열로 변환 한 다음 각 요소에 대해 xor 연산을 수행하는 것입니다. 그런 다음 필요할 때 역 직렬화합니다. 예를 들어

은 - 온라인의 간단한 사건을 맡아>

좀 효율적인 구현을 위해 L1 XOR의 L2를 수행하고 싶지만 자바에서 그것을 할 수있는 청소기 방법을 찾을 수 없습니다
class ListNode { 
    int val; 
    ListNode next; 
    ListNode(int val) {this.val = val;} 
} 

ListNode l1 = new ListNode(2); 
ListNode l1 = new ListNode(3); 

// ListNode x = l1^l2; 

.

제안 사항?

편집 하나의 알고리즘에는 하나의 포인터 만 있지만 XOR 표현을 사용하면 2 개의 주소를 저장할 수 있습니다.

예를 들어, 내 목록은 5의 노드의 다음 포인터를 저장하는 대신 5-> 4-> 3-> 2 - >>>>> ... 입니다. 내가 뭘 하려는지 노드의 다음 필드에 previousPointer XOR nextNodePointer를 저장하는 것입니다.

그래서

5's next pointer = NULL XOR 4 
4's next pointer = 5 XOR 3.......... 

은 그래서, XOR이 경우 결과에 저장해야합니다. 이제 우리는 null이 머리보다 먼저 발생한다는 것을 알 수 있습니다. 4, 우리가 널 (null) XOR nextPointer을 수행 할 수 있습니다 머리의 (5의) 다음 노드에 액세스하려면, 그래서 기본적으로 우리는 '

5 next pointer = null XOR 4 as above/ 
to acess 4 do null XOR (null XOR 4) = 4 
now to access 3 do 5 XOR (5 XOR 3) = 5... 

그래서, 어디 선가이 XOR 정보를 저장하고 싶지만 내가 할 수있는 각 노드에 해당 할 것 새 목록 노드 하나를 만들어 저장하십시오. 주소 수준에서 어떻게 든 수행 할 수있어 결과가 위의 작업과 동일하게 유지됩니다.

+0

두 가지 객체 참조를 XOR하는 것은 무엇을 의미할까요? – Sneftel

+3

데이터 구조에 대해 XOR이 기대하는 것을 정의해야합니다. I1 xor I2의 예상 결과는 무엇입니까? – Ray

+0

왜 관심이 있으십니까? –

답변

2

자바는 연산자 오버로딩을 지원하지 않으므로 ListNode x = l1^l2;을 가지지 않습니다. 대신 방법으로 정의해야합니다 : ListNode x = ListNode.xor(l1, l2);.

를 구현하기 위해, 당신은 단지 노드를 반복 수 :

public static ListNode xor(ListNode l1, ListNode l2) { 
    ListNode result = new ListNode(l1.val^l2.val); 
    while (l1.next != null) { 
     l1 = l1.next; 
     l2 = l2.next; 
     result.next = new ListNode(l1.val^l2.val); 
    } 
} 

참고 :이 구현은 l1l2가 같은 길이 있다고 가정합니다. 이 가정을 할 수 없다면, 그것은 비트로 두 번 꼬여 있어야합니다.

+0

나는 또한이 일을 생각하고 있었지만 이것이 XOR 속성을 수행하지 않을 것이므로 내 경우에는 효과가 없을 것이다. 즉, 결과 XOR l1은 (l1 XOR l2) XOR l1 = l2 인 XOR의 속성 인 l2를 제공하지 않습니다. – jalatif

1

2 개의 인스턴스를 직렬화하고 바이트 배열로 표시하는 것은 의미가 없습니다 (결과는이 클래스의 인스턴스를 올바로 나타내지 않을 것입니다). 만약 당신이 두 intsances의 특정 필드를 xor하려면, 음, 그냥 xor.

+0

@Mureinik에서 언급 한 특정 필드를 XOR 할 수 없습니다. XOR의 속성을 따르지 않습니다. L1 (L1 XOR L2) XOR L1 = L2 L1 및 L2는 사용자 정의 클래스의 객체입니다. – jalatif

0

자바의 가비지 수집기는 참조를 직접 따라갈 수 있으므로 참조로는이 작업을 수행 할 수 없습니다. 아마도 정수 버전의 참조를 얻을 수는 있지만 정수에서 참조로 돌아갈 수는 없으며 노드에 대한 참조를 저장하지 않으면 노드가 가비지 수집됩니다.

원하는 경우 배열의 모든 노드를 보유 할 수 있으며 이전/다음 노드에 대한 참조가있는 각 노드 대신 prev/next 노드의 인덱스가 있습니다. 그러면 XOR 트릭을 할 수 있습니다.

+0

O (1) 공간에서이 트릭을 사용하여 단순한 알고리즘을 수행하는 이유 O (n) 공간에서 Hashtable을 사용합니다. 그래도 알고리즘을 변경해야 할 수도 있습니다. 어쨌든, 당신의 대답을 주셔서 감사합니다 – jalatif

+0

@jalatif XOR 트릭은 알고리즘의 점근 적 공간 복잡성을 변경하지 않습니다. 왜냐하면 그것은 단지 상수 요소가 감소하기 때문입니다. – Sneftel

관련 문제