DEV Community

Tony Metzidis
Tony Metzidis

Posted on

Use the Source Luke! How to Write Clean Code for Interviews

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.

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)