2012-01-17 4 views
7

Qt를 사용하여 명령을 찾고 명령문을 작성하는 데 사용할 사전을 가져와야하는 클래스를 작성 중입니다. 명령은 계층 적 방식으로 배열되며 해당 16 진수 키 및 값 정의를 갖습니다. 예시를 들어, 다음과 같이 수 :번역을위한 사전을 저장할 중첩 된지도 대 Qt 트리 모델

 
01 : Volume 
     | - 01 : Step : 00=Down, 01=Up 
     | - 02 : Set : ceil(255/100 * x) 
02 : Power 
     | - 01 : Power : 00=Off, 01=On 
     | - 02 : Sleep : ...etc 

을 나는이 사전을로드 한 후 "볼륨/설정/50를위한"를 검색 할 수 및 반환 명령 문장 "01 02 80"나보고 싶지 up "01 02 80"을 입력하고 "Volume/Set/50"을 반환하십시오.

실제 구현은 좀 더 복잡하고 트리 구조의 여러 수준에서 명령을 가지며 한 문장에 여러 수준의 명령 조합을 포함 할 수 있습니다.

편집 :

아래 볼로디미르 제공하는 댓글이 개념 내가 익숙하지이었다 (그래서 답장을)를 소개합니다. 이 특정 시나리오에 가장 적합한 구현 일 수도 있지만 좀 더 연구해야합니다. 나는 원래의 질문에 대한 답에 여전히 관심이있다. (Trie의 추가와 함께)

이러한 구현에 대해 각각의 방법을 사용할 때의 장점과 단점은 무엇입니까?

  • Qt는 트리 모델
  • 중첩지도
  • 트리는

원래 질문 :

(컨텍스트)겠습니까 Qt는 트리 모델, 중첩 된 맵 또는 다른 사전을 저장하는 것이 더 낫다는 의미인가? 나는 "더 나은"주관적 일지 모른다는 것을 깨달았지만 트레이드 오프를 알고 싶습니다.

QTreeView에 다른 데이터를 표시하기 위해 Qt Tree Model을 이미 구축 중이므로 코드가 이미 존재하며 쉽게 사용할 수 있습니다. 트리 모델은 다른 구조의 사전로드에 더 많은 유연성을 허용합니까? 이 작업을 수행하는 더 좋은 방법이 있습니까? 아니면 표준 디자인 패턴일까요?

+4

자연 언어 사전의 경우 데이터 구조를 사용할 수 있습니다 (http://en.wikipedia.org/wiki/Trie#Dictionary_representation). 아마 그것은 당신에게 유용 할 것입니다. –

+0

Tries을 연구 한 후에는 단어 (인코딩)와 연결된 16 진수 키를 찾는 데 유용하지만 16 진수 문장을 쉽게 단어 (디코딩)로 변환 할 수있는 기능은 제공하지 않는 것처럼 보입니다. 데이터의 Qt 트리 모델을 작성한 다음 인코딩을 위해 키의 위치를 ​​색인하는 Trie를 만든 다음 Qt 트리 모델을 반복하여 디코딩 기능을 수행하는 것이 적절합니까? – Chris

+0

그런 접근법의 효율성에 대해서는 아무 것도 말할 수 없지만, 이미 재사용 할 수있는 코드를 가지고 있다는 사실을 생각하면 시도해야한다고 생각합니다. 어쨌든, 언급 한대로 Trie의 경우 역방향 변환을 허용하기 위해 TreeModel과 같은 일부 도우미 구조가 필요합니다. 또한, 16 진수로 변환하는 동안 ceil (255/100 * x)와 같은 제공된 인수에 대해 몇 가지 작업을 수행해야합니다. 이 경우에는 직접 번역이 아니기 때문에이를 고려해야합니다. 16 진수와 문자열 표현 사이에 직접적인 일치가있는 경우 양방향 해시를 사용할 수 있습니다. –

답변

1

제 생각에는 명령 트리의 각 레벨에있는 항목 수가 너무 적어서 trie를 사용하는 것을 정당화 할 수 없습니다. trie (http://en.wikipedia.org/wiki/Trie 참조)는 큰 분기 계수로 인해 많은 항목에 적합합니다. 예를 들어 자연 언어 사전은 볼디 미어 (volodymyr)가 지적했듯이.

실제로 숫자가 너무 작아 std :: map조차 정당화 할 수 없습니다. 트리의 주어진 지점에 수 십 개의 명령 또는 코드가 없으면 선형 검색은지도에서 검색만큼 빠르거나 빠릅니다. 벡터 또는 목록으로 표시되는 메모리 표현도 더 간단합니다. 즉, std :: map의 인터페이스는 여러분이하려고하는 것에 매우 잘 맞는 것처럼 보입니다. 그래서 실제적으로는 여전히 최선의 선택 일 것입니다.

코드의 나머지 부분과 더 잘 어울릴 수 있다는 점을 제외하면 QTreeModel이 std :: map보다 (속도, 메모리, 사용 편의성) 모든 관점에서 더 뛰어날 수는 없습니다. Qt입니다. 기반. 그러나이 부분이 Qt없이 사용되는 것으로 막연하게 의심된다면 표준 라이브러리 항목 (std :: map)을 선택하는 것을 주저하지 않을 것입니다.QTreeView에서 QTreeModel을 선택하는 유일한 이유는 실제로 QTreeView에서 사용하는 경우입니다.

+0

또 다른 관심 대상 : 건너 뛰기 목록으로 구현되는 Qt의 QMap이 있습니다. Qt와 통합되어있어 적은 수의 항목을 사용하여 적은 수의 항목으로 좋은 성능을 얻을 수 있다는 장점이 있습니다. 중첩 된 QMaps가 확실히 작동합니다. –

0

Qt TreeModels는 TreeViews와 함께 작동하도록 최적화되어 있으며 정렬 등에 유용합니다. 무작위 액세스 양방향 매핑을 의미하지는 않습니다.

중첩 된지도는 한 방향으로 번역하기 위해 최적화됩니다. 효율적으로 앞뒤로 이동하려면 앞뒤 번역을 위해 맵을 별도로 미러링해야합니다.

std :: maps로 빌드하십시오. 프로파일 링하고 필요할 경우 최적화하십시오.

관련 문제