2013-10-07 5 views
1

를 반환/인쇄되지 내가 그것으로 데 문제가이 오류없이 또는 아무것도 실행한다는 것입니다 quickselect파이썬 Quickselect 여기 피벗

def quickSelect(lst, k): 
if len(lst) != 0: 
    pivot = lst[(len(lst)) // 2] 
    smallerList = [] 
    for i in lst: 
     if i < pivot: 
      smallerList.append(i) 
    largerList = [] 
    for i in lst: 
     if i > pivot: 
      largerList.append(i) 
    count = len(lst) - len(smallerList) - len(largerList) 
    m = len(smallerList) 
    if k >= m and k < m + count: 
     return pivot 
     print(pivot) 
    elif m > k: 
     return quickSelect(smallerList, k) 
    else: 
     return quickSelect(largerList, k-m-count) 

의 코드이지만, 그 자체를 완료 할 때 나는 그것을 기대하고있다 파이썬 쉘 (이 특정 경우에는 목록의 중앙값)에 뭔가를 출력하지만, 나는 아무것도 얻지 못합니다. 내가 여기서 뭔가 잘못하고있는거야? I는 LST 및 k에 대한 입력하고 어떤로서는

....

  • LST = [70, 120, 170, 200]
  • K = LEN (LST) // 2

은 나뿐만 아니라 몇 가지 다른 K 값으로 그것을 시도했지만 아무 소용이

+0

들여 쓰기가 잘못되었지만 들여 쓰기가 잘못되었을 수 있습니다. 함수 정의 다음에 들여 쓰기하지는 않습니다. –

+0

난 그냥 달아서 (들여 쓰기 고정) lst와 k에 대한 입력과 quickSelect (lst, k)는 170을 반환했습니다. quickSelect를 호출하는 방법과 예상되는 것을 말할 수 있습니까? print (quickSelect (lst, k)))를 사용하여 해석기가 결과를 인쇄하는지 확인하십시오. –

답변

0
def quickSelect(lst, k): 
    if len(lst) != 0: 
     pivot = lst[(len(lst)) // 2] 
     smallerList = [] 
     for i in lst: 
      if i < pivot: 
       smallerList.append(i) 
     largerList = [] 
     for i in lst: 
      if i > pivot: 
       largerList.append(i) 
     count = len(lst) - len(smallerList) - len(largerList) 
     m = len(smallerList) 
     if k >= m and k < m + count: 
      return pivot 
      print(pivot) 
     elif m > k: 
      return quickSelect(smallerList, k) 
     else: 
      return quickSelect(largerList, k-m-count) 

lst = [70, 120, 170, 200] 
k = len(lst) // 2 

print(quickSelect(lst, k)) 

을 생산
>>> 170 

내가 수정 한 것은 들여 쓰기뿐이었습니다.

+0

"print (quickSelect (lst, k))"가 내 문제였습니다. 나는 그 기능 내에서 인쇄를 요구하고 있었다. 내가 이렇게 달렸을 때 그것은 효과가 있었다. 포맷팅은 실제로 정확했지만 그냥 복사해서 여기에 이상하게 붙여 넣었습니다. 감사합니다 :) – BLU

3

목록 이해를 사용하여이 알고리즘을 최적화 할 수 있습니다. 또한, 당신이 생각할 필요가 있다고 생각하지 않습니다 ...

def quickSelect(seq, k): 
    # this part is the same as quick sort 
    len_seq = len(seq) 
    if len_seq < 2: return seq 

    ipivot = len_seq // 2 
    pivot = seq[ipivot] 

    smallerList = [x for i,x in enumerate(seq) if x <= pivot and i != ipivot] 
    largerList = [x for i,x in enumerate(seq) if x > pivot and i != ipivot] 

    # here starts the different part 
    m = len(smallerList) 
    if k == m: 
     return pivot 
    elif k < m: 
     return quickSelect(smallerList, k) 
    else: 
     return quickSelect(largerList, k-m-1) 




if __name__ == '__main__': 
    # Checking the Answer 
    seq = [10, 60, 100, 50, 60, 75, 31, 50, 30, 20, 120, 170, 200] 

    # we want the middle element 
    k = len(seq) // 2 

    # Note that this only work for odd arrays, since median in 
    # even arrays is the mean of the two middle elements 
    print(quickSelect(seq, k)) 
    import numpy 
    print numpy.median(seq) 
+0

코드가 우수하지만'pivot '이 단순히'seq [0]'으로 정의 되었다면 더 간단 할 것입니다; 그런 식으로'enumerate'를 사용하지 않아도됩니다 :'smallerList = [x in x in seq [1 :] : x <= pivot '''greaterList = [x for seq [1 :]] if x> 피벗]'. – cjauvin

+0

우리는 이것을 할 수 있지만 피벗의 선택에주의해야합니다. 예를 들어, 항상 n-1 하위 배열로 분리되면 quicksort는 O (nlogn) 대신 런타임 O (n^2)를 갖게됩니다. 중간에 피벗을 선택해도이 문제가 발생하지는 않지만 피벗을 처음 선택하는 것보다 가능성이 적습니다. – bt3gl