Mercurial > hg > GlobalNeighbors
comparison globalneighbors/distance.py @ 7:254195d0bac2
partial implementation of autocomplete using jqueryui; easyautocomplete.com may be more what we want
| author | Jeff Hammel <k0scist@gmail.com> |
|---|---|
| date | Sun, 25 Jun 2017 09:13:48 -0700 |
| parents | 316e1d54ffd4 |
| children | e3d6919130ca |
comparison
equal
deleted
inserted
replaced
| 6:316e1d54ffd4 | 7:254195d0bac2 |
|---|---|
| 36 """ | 36 """ |
| 37 insert `(i, new_distance)` into `distances` | 37 insert `(i, new_distance)` into `distances` |
| 38 keeping distances in order with maximum of size `k` | 38 keeping distances in order with maximum of size `k` |
| 39 """ | 39 """ |
| 40 | 40 |
| 41 if len(distances) == k and new_distance >= distances[-1][-1]: | |
| 42 return | |
| 43 | |
| 41 # TODO: Binary Search Tree | 44 # TODO: Binary Search Tree |
| 42 for _index, (geoid, old_distance) in enumerate(distances): | 45 for _index, (geoid, old_distance) in enumerate(distances): |
| 43 if new_distance < old_distance: | 46 if new_distance < old_distance: |
| 44 distances.insert(_index, (i, new_distance)) | 47 distances.insert(_index, (i, new_distance)) |
| 45 if len(distances) == k+1: | 48 if len(distances) == k+1: |
| 46 distances.pop() | 49 distances.pop() |
| 47 break | 50 break |
| 48 else: | 51 else: |
| 49 distances.append((i, new_distance)) | 52 distances.append((i, new_distance)) |
| 50 | 53 |
| 51 # def insert_distance(distances, i, new_distance, k): | 54 |
| 52 # if not distances: | 55 def insert_distance_bisect(distances, i, new_distance, k): |
| 53 # distances.append((i, new_distance)) | 56 if not distances: |
| 54 # return | 57 distances.append((i, new_distance)) |
| 55 # if new_distance >= distances[-1][-1]: | 58 return |
| 56 # if len(distances) < k: | 59 if new_distance >= distances[-1][-1]: |
| 57 # distances.append((i, new_distance)) | 60 if len(distances) < k: |
| 58 # return | 61 distances.append((i, new_distance)) |
| 62 return | |
| 63 indices = [0, len(distances)] | |
| 64 while True: | |
| 65 midpoint = int((indices[-1] - indices[0])/2) | |
| 59 | 66 |
| 60 | 67 |
| 61 def calculate_distances(locations, r=Rearth): | 68 def calculate_distances(locations, r=Rearth): |
| 62 """ | 69 """ |
| 63 WARNING! This is an N-squared approach | 70 WARNING! This is an N-squared approach |
| 122 new_distance = haversine(*args, r=Rearth) | 129 new_distance = haversine(*args, r=Rearth) |
| 123 | 130 |
| 124 # insert in order | 131 # insert in order |
| 125 for i in (id1, id2): | 132 for i in (id1, id2): |
| 126 distances = neighbors.setdefault(i, []) | 133 distances = neighbors.setdefault(i, []) |
| 127 if len(distances) == k and new_distance >= distances[-1][-1]: | |
| 128 continue | |
| 129 | 134 |
| 130 insert_distance(distances, i, new_distance, k) | 135 insert_distance(distances, i, new_distance, k) |
| 131 | 136 |
| 132 return neighbors | 137 return neighbors |
| 133 | 138 |
