Foundation: Binary Search
/* Binary search.
*
* Implementation history:
* 2013-10-5, Mars Fu, first version.
*/ /* [Binary Search Algorithm]
* Published by John Mauchly(1946) and D.H.Lehmer(1960).
*
* [Uniform Binary Search Algorithm]
* Published by D.E.Knuth(1963) and A.K.Chandra(1971).
*/ #include "stdafx.h"
#include "binary_search.h"
#include "quicksort.h" int
do_binary_search(void *key, void *src, int src_sz, int n, cmp_func cmp)
{
int li,ri,i;
char *p; F_S(); if (key == NULL || src == NULL || cmp == NULL) return 0;
if (src_sz <= 0 || n <= 0) return 0; li = 1;
ri = n;
while (li <= ri) { i = ((li + ri) >> 1); p = (char*)src + (i-1) * src_sz;
if (cmp(key, p) < 0) {
ri = i - 1;
}
else if (cmp(key, p) > 0) {
li = i + 1;
}
else {
goto END;
}
} return 0; END:
F_E();
return i;
} int
do_uniform_binary_search(void *key, void *src, int src_sz, int n, cmp_func cmp)
{
int i,m;
char *p; F_S(); if (key == NULL || src == NULL || cmp == NULL) return 0;
if (src_sz <= 0 || n <= 0) return 0; i = (n + 1) / 2;
m = n / 2;
while (1) { p = (char*)src + (i-1) * src_sz;
if (cmp(key, p) < 0) {
if (m == 0) return 0;
i -= ((m + 1) / 2);
}
else if (cmp(key, p) > 0) {
if (m == 0) return 0;
i += ((m + 1) / 2);
}
else {
goto END;
} m = m / 2;
} return 0;
END:
F_E();
return i;
} int
do_uniform_binary_search_2(void *key, void *src, int src_sz, int n, cmp_func cmp)
{
int i,j,k,h,m;
char *p;
int n2; F_S(); if (key == NULL || src == NULL || cmp == NULL) return 0;
if (src_sz <= 0 || n <= 0) return 0; /* formula:
* h(j) = (n + 2^(j-1)) / (2^j), where 1 <= j <= (int)lg(n) + 2.
*/
n2 = 2;
m = (int)(log((double)n) / log((double)n2)) + 2; for (i = (n + 1) / 2, j = 1, k = 2; j < m; ++j, k <<= 1) { h = (n + k) / (k << 1); p = (char*)src + (i-1) * src_sz;
if (cmp(key, p) < 0) {
if (h == 0) return 0;
i -= h;
}
else if (cmp(key, p) > 0) {
if (h == 0) return 0;
i += h;
}
else {
goto END;
}
} return 0;
END:
F_E();
return i;
} #ifdef BINARY_SEARCH_DEBUG int
int_cmp(void* lv, void* rv)
{
int tmp_lv, tmp_rv; tmp_lv = *(int*)lv;
tmp_rv = *(int*)rv; return (tmp_lv - tmp_rv);
} static void
exchange_int_item(void* lv, void* rv)
{
int tmp_lv, tmp_rv; tmp_lv = *(int*)lv;
tmp_rv = *(int*)rv; *(int*)lv = *(int*)rv;
*(int*)rv = tmp_lv;
} int
main(int argc, char* argv[])
{
int i;
int cnt;
int ret;
int int_items[16] = { 503, 87, 512, 61, 908, 170, 897, 275,
653, 426, 154, 509, 612, 677, 765, 703
};
int key; debug("[Debug binary search].. \r\n"); cnt = sizeof(int_items)/sizeof(int_items[0]); debug("src database:\r\n----\r\n");
for (i = 0; i < cnt; ++i) {
debug("%d ", int_items[i]);
}
debug("\r\n"); ret = do_quick_sort((void*)int_items, sizeof(int), cnt,
int_cmp, exchange_int_item, NULL);
if (!ret) {
debug("failed. \r\n");
goto END;
} debug("src database sorted:\r\n----\r\n");
for (i = 0; i < cnt; ++i) {
debug("%d ", int_items[i]);
}
debug("\r\n"); debug("\r\n----\r\n");
key = int_items[0];
debug("search key %d... \r\n", key);
ret = do_binary_search(&key, int_items, sizeof(int), cnt, int_cmp);
if (!ret) debug("not found.\r\n");
ret = do_uniform_binary_search(&key, int_items, sizeof(int), cnt, int_cmp);
if (!ret) debug("not found.\r\n");
ret = do_uniform_binary_search_2(&key, int_items, sizeof(int), cnt, int_cmp);
if (!ret) debug("not found.\r\n"); debug("\r\n----\r\n");
key = int_items[cnt-1];
debug("search key %d... \r\n", key);
ret = do_binary_search(&key, int_items, sizeof(int), cnt, int_cmp);
if (!ret) debug("not found.\r\n");
ret = do_uniform_binary_search(&key, int_items, sizeof(int), cnt, int_cmp);
if (!ret) debug("not found.\r\n");
ret = do_uniform_binary_search_2(&key, int_items, sizeof(int), cnt, int_cmp);
if (!ret) debug("not found.\r\n"); debug("\r\n----\r\n");
key = int_items[cnt/2];
debug("search key %d... \r\n", key);
ret = do_binary_search(&key, int_items, sizeof(int), cnt, int_cmp);
if (!ret) debug("not found.\r\n");
ret = do_uniform_binary_search(&key, int_items, sizeof(int), cnt, int_cmp);
if (!ret) debug("not found.\r\n");
ret = do_uniform_binary_search_2(&key, int_items, sizeof(int), cnt, int_cmp);
if (!ret) debug("not found.\r\n"); debug("\r\n----\r\n");
key = 12345;
debug("search key %d... \r\n", key);
ret = do_binary_search(&key, int_items, sizeof(int), cnt, int_cmp);
if (!ret) debug("not found.\r\n");
ret = do_uniform_binary_search(&key, int_items, sizeof(int), cnt, int_cmp);
if (!ret) debug("not found.\r\n");
ret = do_uniform_binary_search_2(&key, int_items, sizeof(int), cnt, int_cmp);
if (!ret) debug("not found.\r\n"); debug("\r\n"); debug("[Debug binary search]..done. \r\n"); END:
while (1);
return 1;
} #endif /* BINARY_SEARCH_DEBUG */
#ifndef __BINARY_SEARCH_H__
#define __BINARY_SEARCH_H__ #define BINARY_SEARCH_DEBUG typedef int(*cmp_func)(void*,void*); int do_binary_search(void *key, void *src, int src_sz, int n, cmp_func cmp);
int do_uniform_binary_search(void *key, void *src, int src_sz, int n, cmp_func cmp);
int do_uniform_binary_search_2(void *key, void *src, int src_sz, int n, cmp_func cmp); #endif /* __BINARY_SEARCH_H__ */
#pragma once #include <windows.h>
#ifdef _WIN32
#define msleep(x) Sleep(x)
#endif #include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <math.h> #define MY_DEBUG
#ifdef MY_DEBUG
#define debug printf
#else
#define debug(x,argc, __VA_ARGS__) ;
#endif /* MY_DEBUG */ #define F_S() debug("[%s]..\r\n", __FUNCTION__)
#define F_E() debug("[%s]..done. \r\n", __FUNCTION__)
Enjoy~
Mars
October 5, 2013
Foundation: Binary Search的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
- Leetcode 笔记 98 - Validate Binary Search Tree
题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...
- Leetcode: Convert sorted list to binary search tree (No. 109)
Sept. 22, 2015 学一道算法题, 经常回顾一下. 第二次重温, 决定增加一些图片, 帮助自己记忆. 在网上找他人的资料, 不如自己动手. 把从底向上树的算法搞通俗一些. 先做一个例子: 9 ...
- [LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
- [LeetCode] Closest Binary Search Tree Value 最近的二分搜索树的值
Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...
- [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...
- [LeetCode] Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...
- [LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...
随机推荐
- MediaCodec文档翻译
MediaCodec|文档翻译 classoverView mediacodec类可以用来调用系统底层的编码/解码软件. mediacodec一般是这么用的: MediaCodec codec = M ...
- 得于吾师傅的js知识 js类,单写模板,和私有保护的方法
js的类的写法: 1,写法一:function内部包含this.function()如代码: var origin_class = function(name) { var lover = ''; t ...
- ChesFrame框架介绍
一直以来想写一个框架,想达到的目的: 1.对曾经做过项目的总结 2.节约构建系统的成本,不用每次都从零开始做起 3.写框架并在使用中不断的完善框架,这也是个积攒过程. 经历了一个多月的时间,一个基本的 ...
- HTML5 History对象,Javascript修改地址栏而不刷新页面
一.History对象 History 对象包含用户(在浏览器窗口中)访问过的 URL. History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问. ...
- ExcelApplication 另存Excel的SaveAs函数
procedure SaveAs(const Filename: WideString; FileFormat: OleVariant; Password: OleVariant; WriteResP ...
- iOS程序崩溃*** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [37.5 nan]'
今天上班打开昨天的程序运行,昨天跑的很溜的程序今天竟然crash了,好郁闷啊!下面附上crash的栈打印信息: 经过一番调试终于找到了原因,程序crash是因为CALayer的位置中含有不存在的数,就 ...
- 加入强调语气,使用<strong>和<em>标签
有了段落又有了标题,现在如果想在一段话中特别强调某几个文字,这时候就可以用到<em>或<strong>标签. 但两者在强调的语气上有区别:<em> 表示强调,< ...
- 防止sql注入 参数化解决方案
StringBuilder strSql=new StringBuilder(); strSql.Append("insert into T_SysLog("); strSql.A ...
- grails框架中读取txt文件内容将内容转换为json格式,出现异常Exception in thread "main" org.json.JSONException: A JSONObject text must begin with '{' at character 1 of [...]
Exception in thread "main" org.json.JSONException: A JSONObject text must begin with '{' a ...
- 002.AngularJs调用Restful实现CRUD
本节我们主要给大家介绍AngularJs如何调用Restful,实现数据的CRUD. 主要用到的技术: 后端:ASP.NET WebApi + SQLServer2008 前端:AngularJs,B ...