Use the Source Luke! How to Write Clean Code for Interviews
Tony Metzidis
Posted on June 14, 2019
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.
Posted on June 14, 2019
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
October 17, 2020