发布于 2014-10-24 15:17:26 | 169 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的精品教程,程序狗速度看过来!

百度(Baidu)中文搜索引擎

百度(Nasdaq简称:BIDU)是全球最大的中文搜索引擎,2000年1月由李彦宏、徐勇两人创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。


1、进程切换需要注意哪些问题?

保存处理器PC寄存器的值到被中止进程的私有堆栈;      保存处理器PSW寄存器的值到被中止进程的私有堆栈;    保存处理器SP寄存器的值到被中止进程的进程控制块;

保存处理器其他寄存器的值到被中止进程的私有堆栈;     自待运行进程的进程控制块取SP值并存入处理器的寄存器SP;    自待运行进程的私有堆栈恢复处理器各寄存器的值;

自待运行进程的私有堆栈中弹出PSW值并送入处理器的PSW;     自待运行进程的私有堆栈中弹出PC值并送入处理器的PC。

2、输入一个升序数组,然后在数组中快速寻找两个数字,其和等于一个给定的值。

这个编程之美上面有这个题目的,很简单的,用两个指针一个指向数组前面,一个指向数组的后面,遍历一遍就可以了。

3、有一个名人和很多平民在一块,平民都认识这个名人,但是这个名人不认识任何一个平 民,任意两个平民之间是否认识是未知的,请设计一个算法,快速找个这个人中的那个名人。  已知已经实现了一个函数  bool know(int a,int b) 这个函数返回true的时候,表明a认识b,返回false的时候表明a不认识b。

思路:首先将n个人分为n/2组,每一组有2个人,然后每个组的两个人调用这个know 函数,假设为know(a,b),返回true的时候说明a认识b,则a肯定不是名人,a可以排除掉了,依次类推,每个组都调用这个函数依次,那么n个人 中就有n/2个人被排除掉了,数据规模将为n/2。同理在剩下的n/2个人中在使用这个方法,那么规模就会将为n/4,这样所有的遍历次数为n/2+n /4+n/8+........ 这个一个等比数列,时间复杂度为o(n)。

4、有一类数组,例如书序[1,2,3,4,6,8,9,4,8,11,18,19,100] 前半部分是是一个递增数组,后面一个还是递增数组,但整个数组不是递增数组,那么怎么最快的找出其中一个数?

#include <iostream>  

using namespace std;  

  

int binary_search(int* a, int low, int high, int goal)    //二分查找  

{  

    while(low <= high)  

    {  

        int middle = (low+high)>>1;    //(low+high)/2  

        if(a[middle] == goal)  

            return middle;  

        //在右半边  

        else if(a[middle] < goal)  

            low = middle + 1;  

        //在左半边  

        else  

            high = middle - 1;  

    }  

    return -1;  

}  

void getNum(int *a, int len, int goal)  

{  

    int i, index;  

    for(i = 0; i < len-1; i++)  

    {  

        if(a[i] > a[i+1])     //找到前、后两个数组的分界点  

            break;  

    }  

    if(a[i] >= goal)          //对前面数组进行二分查找  

    {  

        index = binary_search(a, 0, i, goal);  

        printf("%d\n",index);  

    }  

    if(a[i+1] <= goal)         //对后面数组进行二分查找  

    {  

        index = binary_search(a+i+1, 0, len-i-2, goal);  

        if(index != -1)  

            index += (i+1);    //后面的那个数组相对于前面数组的偏移量为i+1  

        printf("%d\n",index);  

    }  

}  

  

int main(void)  

{  

    int a[]={1,2,3,4,6,8,9,4,8,11,18,19,100};  

    int len = 13, goal = 4;  

    getNum(a,len,goal);  

    return 0;  

}  

5、判断一个自然数是否是某个数的平方。当然不能使用开方运算。

方法1:
遍历从1到N的数字,求取平方并和N进行比较。
如果平方小于N,则继续遍历;如果等于N,则成功退出;如果大于N,则失败退出。
复杂度为O(n^0.5)。

方法2:
使用二分查找法,对1到N之间的数字进行判断。
复杂度为O(log n)。

方法3:
由于
(n+1)^2
=n^2 + 2n + 1,
= ...
= 1 + (2*1 + 1) + (2*2 + 1) + ... + (2*n + 1)
注意到这些项构成了等差数列(每项之间相差2)。
所以我们可以比较 N-1, N - 1 - 3, N - 1 - 3 - 5 ... 和0的关系。
如果大于0,则继续减;如果等于0,则成功退出;如果小于 0,则失败退出。
复杂度为O(n^0.5)。不过方法3中利用加减法替换掉了方法1中的乘法,所以速度会更快些。

例如:3^2 = 9 = 1 + 2*1+1 + 2*2+1 = 1 + 3 + 5

4^2 = 16 = 1 + 2*1 + 1 + 2*2+1  + 2*3+1

int square(int n)  

{  

    int i = 1;  

    n = n - i;  

    while( n > 0 )  

    {  

        i += 2;  

        n -= i;  

    }  

    if( n == 0 )        //是某个数的平方  

        return 1;  

    else                //不是某个数的平方  

        return 0;  



最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务