2013-04-23 3 views
1

모스 코드 알파벳 (마침표와 아포스트로피)의 이진 트리를 만들고 모스 선을 읽는 프로그램을 작성하고 있습니다. 코드를 작성하여 영어로 번역하십시오. (네, 룩업 테이블이 더 쉬울 것이라는 것을 알고 있지만, 저는 이진 트리를 분류해야합니다). 내 문제의 좋은 점은 심볼 순서가 아닌 알파벳 순서로 값을 트리에 넣고 싶다는 것입니다. 그러나 반드시 그렇게 할 수있는 방법이 있어야합니다. 왜냐하면 숫자가 아닌 백만 개의 값이 있다면 가장 간단한 삽입 순서로 정렬 할 필요가 없기 때문입니다 ... 맞습니까?파이썬 - 이진 트리를 통한 모스 코드 변환

각 줄마다 모스 부호가 하나있는 텍스트 파일에서 읽는 중입니다. - .... .. .. .. .. .. ..-. ..-. 예를 들면, 이것은 "재미 있습니다." 기호 사이의 공백은 새로운 문자임을 나타내며 2 공백은 새로운 단어를 의미합니다.

위의 줄에 ". $$$"이라는 출력이 표시되는데 이는 마침표를 읽은 다음 ('$$$')으로 상징되는 오류가 발생한다는 것을 의미합니다. 분명히 잘못되었습니다 ...

내가 전에 말했던 것처럼, 나는 복잡하다는 것을 알고 있지만, 분명히 내 나무의 값을 정렬하지 않고 이것을 할 수있는 방법이 있습니다. 그리고 이것을 지금 생각하고 싶습니다. 내가 시간 위기에 처했을 때가 아니라.

아무도 통찰력이 있습니까? 이 무언가가 그렇게 끔찍하게 명백해서 내가 그것에 대해 묻기 위해 창피해야합니까?

답변

3

SO에 오신 것을 환영합니다. 흥미로운 질문에 감사드립니다. 예, 조금 복잡 해지는 것처럼 보입니다. 예를 들어, 여기서 클래스를 사용할 필요가 전혀 없습니다. 당신은 나무를 표현하기 위해 기존의 파이썬 데이터 구조를 재사용 할 수 있습니다 : 이것은 당신에게 작업하기 쉬울 것입니다 키 ., -value와 중첩 딕셔너리를 제공

def add(node, value, code): 
    if code: 
     add(node.setdefault(code[0], {}), value, code[1:]) 
    else: 
     node['value'] = value 

tree = {} 
for value, code in alphabet: 
    add(tree, value, code) 

import pprint; pprint.pprint(tree)  

.

+0

고마워요! 그러나 사전에 이런 종류의 작업을 수행하는 방법을 이미 알아 냈습니다. 나는 지금 일종의 링크드리스트로 배우기를하고 있는데, 왜 이런 링크로는 작동하지 않는지 알 수 없다 ... 내가 모르는 링크 된 "whatsits"가있는 내재적 결함이 있는가? 대략입니까, 아니면 내 구현입니까? 나는 연결된 목록을 알아 냈고, 모든 것을 뒤죽박죽하지 않고 중간에 값을 삽입하는 법을 배웠습니다. 그래서 저는 저와 꽤 비슷한 것 같은 문제가있는 이유를 이해하지 못합니다 ... 더 이상의 팁? 아니면이 방법을 완전히 버려야합니까? – user2309856

+0

@ user2309856 : 개인적으로 "연결된 목록"및 기타 저급 데이터 구조를 연구하는 것이 실제 가치가 있다고 생각하지 않습니다. 고급 언어에서 이런 종류의 물건은 이미 당신에게 주어집니다. 나의 충고 : 간단하면서도 실제적인 문제에 대한 훌륭한 관용적 인 비단뱀 작성법을 배워라. 예를 들어 모스 코드 디코더는 정확히 지적했듯이 룩업 테이블이 가장 좋은 방법이며 5 줄 이상의 코드 만 필요합니다. 문제는 다음 문제까지 해결되었습니다. – georg