improve lower_bound

This commit is contained in:
blueloveTH 2024-07-02 19:40:52 +08:00
parent 163effc00d
commit c6185c3d9c
2 changed files with 12 additions and 15 deletions

View File

@ -12,7 +12,7 @@ extern "C" {
do { \ do { \
T* __first = ptr; \ T* __first = ptr; \
int __len = count; \ int __len = count; \
while(__len != 0) { \ while(__len > 8) { \
int __l2 = __len >> 1; \ int __l2 = __len >> 1; \
T* __m = __first + __l2; \ T* __m = __first + __l2; \
if(less((*__m), (key))) { \ if(less((*__m), (key))) { \
@ -22,6 +22,10 @@ extern "C" {
__len = __l2; \ __len = __l2; \
} \ } \
} \ } \
while(__len && less(*__first, (key))) { \
++__first; \
--__len; \
} \
*(out_index) = __first - (T*)(ptr); \ *(out_index) = __first - (T*)(ptr); \
} while(0) } while(0)
@ -30,7 +34,8 @@ extern "C" {
* @param ptr Pointer to the first element of the array. * @param ptr Pointer to the first element of the array.
* @param count Number of elements in the array. * @param count Number of elements in the array.
* @param elem_size Size of each element in the array. * @param elem_size Size of each element in the array.
* @param cmp Comparison function that takes two elements and returns an integer similar to `strcmp`. * @param cmp Comparison function that takes two elements and returns an integer similar to
* `strcmp`.
*/ */
void c11__stable_sort(void* ptr, void c11__stable_sort(void* ptr,
int count, int count,

View File

@ -86,19 +86,11 @@ void METHOD(set)(NAME* self, K key, V value) {
} }
V* METHOD(try_get)(const NAME* self, K key) { V* METHOD(try_get)(const NAME* self, K key) {
// use `bsearch` which is faster than `lower_bound` int index;
int low = 0; c11__lower_bound(KV, self->data, self->count, key, partial_less, &index);
int high = self->count - 1; if(index != self->count){
KV* a = self->data; KV* it = c11__at(KV, self, index);
while(low <= high){ if(equal(it->key, key)) return &it->value;
int mid = (low + high) / 2;
if(equal(a[mid].key, key)){
return &a[mid].value;
} else if(less(a[mid].key, key)){
low = mid + 1;
} else {
high = mid - 1;
}
} }
return NULL; return NULL;
} }