2017-10-27 4 views
0

검색 알고리즘을 실험하고 있는데 A * 알고리즘을 사용하여 문제를 해결하려고합니다.Python - 사전 목록 정렬

내부 노드 구조를 유지하기 위해 사전 목록을 사용하고 있습니다. 각 노드는 특정 상태 및 관련 비용으로 특징 지어집니다. 선택 함수는 비용이 가장 낮은 노드를 반환해야합니다. 이렇게하려면 매번 목록을 필터링하고 있습니다. 문제가 매우 작 으면 매우 빠르다는 것을 발견했습니다. 목록이 매우 큰 경우이 함수는 알고리즘의 총 시간 중 84 %를 사용합니다.

내 질문에이 일을하는 더 효율적인 방법이 있습니다.

def select(self, frontier): 
    frontier.sort(key = lambda x: x['f_cost']) 
    #select the node with the lowest f_cost 
    return frontier.pop(0) 
+0

우선 순위 대기열을 대신 사용해 볼 수도 있습니다. 예 : ['heapq'] (https://docs.python.org/3/library/heapq.html). –

답변

2

그래, 처음부터 .pop하지 마라! 그것은 선형 시간입니다. 끝에서 .pop는 일정, 그래서 그냥 수행

def select(self, frontier): 
    frontier.sort(key = lambda x: x['f_cost'], reverse=True) 
    #select the node with the lowest f_cost 
    return frontier.pop() 

당신은 정렬 된 순서를 유지하려는 경우, 다른 데이터 구조를 고려할 수 있습니다. 꽤 베어 본이지만 표준 라이브러리의 일부인 heapq을 볼 수 있습니다. 또한 라이브러리를 고려해보십시오. 이는 분명히 매우 실적이 좋은입니다.

+0

"처음부터 팝"(O (n))은 아마도 정렬 (O (n log n))만큼 나쁘지 않으므로 응답의 두 번째 부분 (다른 데이터 구조 사용)이 더 유망 해 보입니다. – Sebastian

+0

@Sebastian 사실이지만 timsort는 최악의 경우 * O (n log n)입니다. 그러나 거의 정렬 된 목록을 정렬 할 때는 * 매우 놀랍습니다. 즉, 귀하의 요점은 여전히 ​​의미합니다. –

+0

@ juanpa.arrivillaga 전방에서 터지는 것과 비교하면 엄청나게 빠르지 않습니다. 그것은 그것에 비해 매우 느립니다. 시도 해봐. –