假如有一堆数字(升序),如1,3,8,11,29....想从中找到某个数字(如10),如果10存在则返回10,而此时10并不存在,那么则返回比10大或小的第一个数(此时应该是8或者11) 该如何设计算法?
解决方案 »
- DirectDraw窗口模式的一个问题,急!!!
- 如何做一个BHO插件捕获网页里的插件信息和脚本信息
- Dll中是否可以实例化主程序中的对象
- 请问 包含有子程序的汇编 能嵌入到 VC 里面吗?
- 请问:SM_CXSCREEN和SM_CXSCREEN是什么意思?
- 谁能提供Cbitmap这个类的结构层次.
- 谁能帮我解释一下CBitmap::LoadBitmap 的参数?多谢
- 编译报错
- VS2010打SP1补丁MFC静态链接EXE体积变大问题,按照网上的办法编译不通
- 编译器老说:error C2065: 'CoCreateInstanceEx' : undeclared identifier
- 没有设置支持windows sockets的对话框工程,如果补上?
- 请问迅雷7的界面是用的什么技术?
{
while(left <= right)
{
int middle = (left + right) / 2;
if(x == a[middle])
return middle;
if(x > a[middle])
left = middle + 1;
else
right = middle - 1;
}
return -1;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int a[] = {1, 3, 8, 11, 29};
const int key = 10;
int left = 0;
int right = sizeof(a)/sizeof(a[0])-1;
int nIndex = BinarySearch(a, key, left, right);
if(-1 != nIndex)
printf("index: %d\n", nIndex);
else
{
printf("> %d : %d\n", key, a[left]);
printf("< %d : %d\n", key, a[right]);
}
return 0;
}
堆首先要建堆(nlogn),然后不断pop前k个极值,调整堆(klogn),对于找前k个最大数据比较有效(stl里make_heap...)。
BST和二分类似,不过要保持平衡,代码麻烦点。
lower_bound是顺序遍历还是什么的,看看源码就知道了,大多数常用自己写的话,很可能不如STL的算法实现,效率、可扩展性这些难以达到STL的高度。