당신은 단순히 이진 검색를 사용할 수 있습니다. 물론
이 기능은 list
에 f
의지도의 형식이라고 가정 그렇지 않은 경우
f(list) == [False,False,...,False,True,True,...,True]
, 그것은 일반적으로 스왑를 찾을 수 있지만, 어느 쪽이 오히려입니다 정의되지 않았습니다.
말 f
그렇게 lambda v:v >= '2'
, 다음이 반환됩니다 "버전은 2 이상은"단순히 :
>>> binary_f(lambda v:v >= '2',['1.0', '1.14', '2.3', '3.1', '4'])
2
그래서 인덱스 2
. 전체 목록이 False
개의 개체로 반환되는 경우 **는 len(list)
을 반환합니다. 이 "가정"때문에 단지 목록 이외의 요소는 True
로 평가됩니다 : 물론
>>> binary_f(lambda v:v >= '4.2',['1.0', '1.14', '2.3', '3.1', '4'])
5
당신의 예에 f
는 works
입니다.
실험 :
>>> binary_f(lambda v:v >= '2',['1.0', '1.14', '2.3', '3.1', '4'])
2
>>> binary_f(lambda v:v >= '0',['1.0', '1.14', '2.3', '3.1', '4'])
0
>>> binary_f(lambda v:v >= '1',['1.0', '1.14', '2.3', '3.1', '4'])
0
>>> binary_f(lambda v:v >= '1.13',['1.0', '1.14', '2.3', '3.1', '4'])
1
>>> binary_f(lambda v:v >= '2.4',['1.0', '1.14', '2.3', '3.1', '4'])
3
>>> binary_f(lambda v:v >= '3',['1.0', '1.14', '2.3', '3.1', '4'])
3
>>> binary_f(lambda v:v >= '3.2',['1.0', '1.14', '2.3', '3.1', '4'])
4
>>> binary_f(lambda v:v >= '4.2',['1.0', '1.14', '2.3', '3.1', '4'])
5
(I 여기서 물론 아주 싼 버전 확인을했지만 좀 더 정교한 술어 물론 작동). 이 이진 검색이기 때문에
그것은 N 선형 검색 반면,리스트 내의 항목의 수와 O (로그 n)에서 실행 수 O (N) 수표 결과 (인 보통 더 비싸다).
편집는 : 경우 목록이 두 값을 포함하고 당신은 스왑, 당신은 단순히 첫 번째 인덱스 0
에 대한 값을 계산할 수 찾으려면 : 제공 한 후
val0 = f(list[0])
및 binary_f
을 :
binary_f(lambda v:works(v) != val0,list)
멋진 기능에 넣거나 :
def binary_f_val(f,list):
val0 = f(list[0])
return binary_f(lambda x:f(x) != val0,list)
왜이 질문은 다운 되었습니까? –