dichotomy.py 920 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. import timeit
  2. def first(iterable, validation):
  3. l, r = 0, len(iterable) - 1
  4. if validation(iterable[l]):
  5. return iterable[l]
  6. # if not validation(iterable[r]):
  7. # return None
  8. while l < r:
  9. mid = (r + l) // 2
  10. if validation(iterable[mid]):
  11. r = mid
  12. else:
  13. l = mid + 1
  14. if not validation(iterable[l]):
  15. return None
  16. return iterable[r]
  17. def last(iterable, validation):
  18. l, r = 0, len(iterable) - 1
  19. if validation(iterable[r]):
  20. return iterable[r]
  21. # if not validation(iterable[l]):
  22. # return None
  23. while l < r:
  24. mid = (r + l) // 2
  25. if validation(iterable[mid]):
  26. l = mid + 1
  27. else:
  28. r = mid
  29. if not validation(iterable[r]):
  30. return None
  31. return iterable[r - 1]
  32. lst = [0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0]
  33. def test(i):
  34. return i == 4
  35. print(first(lst, test))