I'm helping a friend prepare for interviews, and there are a lot of resources to practice algorithms & data structures.
Eventually it's just you and the board, and you have to write clean code.
Often you know the algo well, but while on the board you stumble iterating a pointer -- a little detail that undermines your confidence.
The question for me was : "when doing binary search, do you set the pivot to the ceil or floor of the midpoint?"
My answer, as usual: "use the source!"
Here's bsearch
from linux src. (I first recommended glibc -- but this one is easier to read--i don't judge)
// SPDX-License-Identifier: GPL-2.0-only
/*
* A generic implementation of binary search for the Linux kernel
*
* Copyright (C) 2008-2009 Ksplice, Inc.
* Author: Tim Abbott <tabbott@ksplice.com>
*/
#include <linux/export.h>
#include <linux/bsearch.h>
#include <linux/kprobes.h>
/*
* bsearch - binary search an array of elements
* @key: pointer to item being searched for
* @base: pointer to first element to search
* @num: number of elements
* @size: size of each element
* @cmp: pointer to comparison function
*
* This function does a binary search on the given array. The
* contents of the array should already be in ascending sorted order
* under the provided comparison function.
*
* Note that the key need not have the same type as the elements in
* the array, e.g. key could be a string and the comparison function
* could compare the string with the struct's name field. However, if
* the key and elements in the array are of the same type, you can use
* the same comparison function for both sort() and bsearch().
*/
void *bsearch(const void *key, const void *base, size_t num, size_t size,
int (*cmp)(const void *key, const void *elt))
{
const char *pivot;
int result;
while (num > 0) {
pivot = base + (num >> 1) * size;
result = cmp(key, pivot);
if (result == 0)
return (void *)pivot;
if (result > 0) {
base = pivot + size;
num--;
}
num >>= 1;
}
return NULL;
}
EXPORT_SYMBOL(bsearch);
NOKPROBE_SYMBOL(bsearch);
num>=1
-- a bitshift equivalent to floor(1/2 * n) -- faster and cleaner!
When searching for answers to these little details, use the source: stable mature repos used by millions.
- linux sources
- glibc
- boost c++
- the standard lib for your platform e.g. python, nodejs, etc
Each one of these is a goldmine for thousands of tricks when writing code. Clone them locally and ack
them before you google.
Top comments (0)