문제

나는 대표하고 싶다 스레드 댓글 자바에서. 이것은 댓글이 나오는 방식과 비슷해 보일 것입니다. reddit.com

hello
   hello
      hello
      hello
   hello
   hello
      hello

위의 예에서와 같이, 응답은 HTML에 중첩되어 적절한 들여 쓰기와 함께 이전 의견과의 관계를 반영합니다.

자바에서 이것을 대표하는 효율적인 방법은 무엇입니까?

나는 어떤 종류의 생각을 생각하고있다 트리 데이터 구조 적절할 것입니다.

그러나 특히 하나가있을 것입니다 가장 효율적입니다 트리 트래버스를 최소화하려면?

각 의견에 투표를하면 중요합니다. 그러면 각 투표 후에는 트리를 재주문해야하기 때문에 잠재적으로 비싼 작업이 계산적으로 비싸다.

그건 그렇고, 누군가가 Java에서 이것의 기존 구현을 오픈 소스에 대해 알고 있다면, 그도 도움이 될 것입니다.

도움이 되었습니까?

해결책

링크 된 목록의 레벨을 사용합니다.

message1
    message2
        message3
        message4
    message5
    message6
        message7

각 노드는 다음에 대한 포인터가 있습니다.

- forward sibling  (2->5, 3->4, 5->6,                   1/4/6/7->NULL).
- backward sibling (4->3, 5->2, 6->5,                   1/2/3/7->NULL).
- first child      (1->2, 2->3, 6->7,                   3/4/5/7->NULL).
- parent           (2->1, 3->2, 4->2, 5->1, 6->1, 7->6,       1->NULL).

각 레벨 내에서 메시지는 투표 수 (또는 사용하려는 다른 점수)별로 목록에 정렬됩니다.

그것은 당신에게 물건을 움직일 수있는 최대한의 유연성을 제공하고 당신은 전체 서브 트리를 움직일 수 있습니다 (예 : message2) 부모와 그 수준의 링크를 변경함으로써.

예를 들어 message6 투표가 유입되어 message5. 변경 사항은 다음과 같습니다 (다음과 이전 형제 포인터를 모두 조정) :

  • message2 -> message6
  • message6 -> message5
  • message5 -> NULL.

얻기 위해 :

message1
    message2
        message3
        message4
    message6
        message7
    message5

그것이 더 많은 표보다 더 많은 표를 얻을 때까지 계속된다면 message2, 다음은 다음과 같습니다.

  • message6 -> message2
  • message2 -> message5

그리고 첫 번째 자녀 포인터 message1 설정되었습니다 message6 (그랬어 message2), 여전히 상대적으로 쉽게 얻을 수 있습니다.

message1
    message6
        message7
    message2
        message3
        message4
    message5

점수 변경으로 인해 메시지가 상단 형제 이상이되거나 하단 형제보다 작을 때만 재주문하면됩니다. 모든 점수가 변경된 후에 다시 주문할 필요는 없습니다.

다른 팁

트리가 옳습니다 (getlastsibling 및 getnextsibling과 함께) 그러나 데이터를 저장/쿼리하는 경우 각 항목에 대한 계보를 저장하거나 선주문으로 숫자를 저장하려고합니다.

http://www.sitepoint.com/article/hierarchical-data-database/2/

정확한 서브 노드 수를 잃어버린 경우 틈을 남기 위해 틈을 남길 수 있습니다. 그럼에도 불구하고, 나는 이것이 매번 나무를 가로 지르는 것보다 눈에 띄게 빠를 것이라고 확신하지 않습니다. 나는 그것이 당신의 나무가 얼마나 깊은 지에 달려 있다고 생각합니다.

또한보십시오:

SQL- 계층 구조를 저장하고 탐색하는 방법? http://www.ibase.ru/devinfo/dbmstrees/sqltrees.html (이 계획은 Celko Tree라고도합니다)

각 의견에 투표를하면 중요합니다. 그러면 각 투표 후에는 트리를 재주문해야하기 때문에 잠재적으로 비싼 작업이 계산적으로 비싸다.

나에게 조기 최적화처럼 들릴 것입니다.

트리 데이터 구조는 데이터를 나타내는 데 논리적으로 들립니다. 나는 그것을 고수한다고 말한다. 성능 문제를 감지하고 측정 한 경우에만 나중에 최적화하고 대안과 비교할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top