2015-01-19 2 views
-4

파이썬은 2.7.3에서 최소 힙 데이터 구조가 내장되어 있습니까?파이썬에는 최소 힙 데이터 구조가 내장되어 있습니까?

코드를 가져오고 싶지 않습니다.

내가 원하는

myheap = minheap(key=lambda x: x[1]) 
myheap.add(obj) 
o = myheap.pop() 

같은이 가능합니까?

+0

내장되어 있지 않으므로 ['import heapq'] (https://docs.python.org/2/library/heapq.html)를 사용해야합니다. –

+0

표준 라이브러리의 ['heapq'] (https://docs.python.org/2/library/heapq.html) 모듈을 확인하십시오 ... – MattDMo

답변

1

파이썬은 다운로드 할 필요는 없지만, 여전히 수입에 가지고있는, heapq와 함께 제공됩니다.

파이썬은 import 문을 사용하지 않고 사용할 수있는 데이터 구조가 거의 없습니다. 귀하의 언어가 모든 표준 라이브러리를 모든 프로젝트의 메모리와 네임 스페이스에로드하게하고 싶습니까? 아무도 아직 언급되지 것대로 key=를 지원하지 않습니다,하지만 -

+0

heapq에서 객체를 넣는다면 어떻게 할 수 있습니까? 열쇠를 지정하기 위해 람다 (lambda)를 사용 하시겠습니까? heapq.heappush (Q, v, key = lambda x : f (x))와 마찬가지로 – omega

+0

@omega, 내 대답에서 말했듯이,'heapq'는'key ='를 지원하지 않는다. 당신의 Q에 영향을 미치지 않는 보조 기능들). –

4

모두가 말한다처럼, heapq이 그것입니다! 따라서 key=이 지원되는 곳이면 어디서나 내부적으로 사용되는 좋은 오래된 DSU (decorate-sort-undecorate) 관용구로 넘어갈 필요가 있습니다 (heapq에 아예 없습니다. nlargestnsmallest 제외). 나머지 모듈).

그래서 당신은 당신의 자신의 클래스의 예를 들면 키의 추가와 함께, heapq 기능을 래핑 할 수 있습니다

import heapq 

class MyHeap(object): 
    def __init__(self, key, data=()) 
     self.key = key 
     self.heap = [(self.key(d), d) for d in data] 
     heapq.heapify(self.heap) 

    def push(self, item): 
     decorated = self.key(item), item 
     heapq.heappush(self.heap, decorated) 

    def pop(self): 
     decorated = heapq.heappop(self.heap) 
     return decorated[1] 

    def pushpop(self, item): 
     decorated = self.key(item), item 
     dd = heapq.heappushpop(self.heap, decorated) 
     return dd[1] 

    def replace(self, item): 
     decorated = self.key(item), item 
     dd = heapq.heapreplace(self.heap, decorated) 
     return dd[1] 

    def __len__(self): 
     return len(self.heap) 

pushpopreplace의 차이에 대한 https://docs.python.org/2/library/heapq.html을 참조하십시오 (다른 보조 기능에 의해 공급 표준 라이브러리 모듈 heapq).

+0

heapq에서 객체를 넣는 경우 어떻게 람다를 사용하여 키를 지정할 수 있습니까? heapq.heappush (Q, v, key = lambda x : f (x))와 같이 – omega

+1

'heapq'에서 직접 대답하지 않습니다. 위의'MyHeap' 클래스에서, 당신은'h = MyHeap (func)'을 인스턴스화합니다, 그리고 나서 자동적으로 특징 추출 함수가 사용됩니다. 'func'''lambda'로 사용하기를 원한다면, 파이썬의 가장 단순한 기능 중 하나는 깨끗하고 빠른'operator.itemgetter (1)'(물론'import 연산자 '가 필요합니다)가 아니라는 것입니다. , 당신을 멈추게한다. (귀도 (Guido, 독특한 것은 아니지만, 원래의 디자인 결정에서 벗어나 파이썬 3에서 람다를 없애기 때문에, 적어도 파이썬 4 이후부터는 갇혀있다. –

+0

@AlexMartelli https://docs.python.org/2/library/heapq.html#basic-examples의 두 번째 예는 heapq와 함께 튜플을 사용하는 방법을 나타내며, 첫 번째 요소는 키라고 가정합니다. – ziddarth

관련 문제