首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

中科院的一道面试题,求大家给个标准的答案啊多谢

2014-01-03 
中科院的一道面试题,求大家给个标准的答案啊!!谢谢设有n个不同的元素存于顺序结构中,试问:用少于2n-3的比

中科院的一道面试题,求大家给个标准的答案啊!!谢谢
设有n个不同的元素存于顺序结构中,试问:用少于2n-3的比较次数选出这n个元素的最大值和最小值。
[解决办法]
每次取两个数,比较二者,再把大的和max比,小的和min比。
这样是3n/2的复杂度
[解决办法]
楼上的是一种办法,你还可以用随机求第k 大的算法来求
[解决办法]
也可以采用二分法


pair<int,int> findMaxMin(int a[], int n)
{
    if(n == 2){
        if(a[0] < a[1]) return make_pair(a[1],a[0]);
        else return make_pair(a[0],a[1]);
    }
    if(n == 1) return make_pair(a[0],a[0]);

    pair<int,int> leftMaxMin, rightMaxMin;
    leftMaxMin = find(a, n>>1);
    rightMaxMin = find(a+(n>>1), n-(n>>1));
    return make_pair(leftMaxMin.first > rightMaxMin.first ? 
                     leftMaxMin.first : rightMaxMin.first ,
                     leftMaxMin.second < rightMaxMin.second ? 
                     leftMaxMin.second : rightMaxMin.second);
}

则在一次的findMaxMin调用中,最多比较四次,即
(1)if(n == 1)
(2)if(n == 2)
(3)leftMaxMin.first > rightMaxMin.first ? leftMaxMin.first : rightMaxMin.first
(4)leftMaxMin.second < rightMaxMin.second ? leftMaxMin.second : rightMaxMin.second
另一方面,由于二分,findMaxMin的调用次数为O(log2(n)),则总的比较次数O(4log2(n))

[解决办法]
引用:
也可以采用二分法

pair<int,int> findMaxMin(int a[], int n)
{
    if(n == 2){
        if(a[0] < a[1]) return make_pair(a[1],a[0]);
        else return make_pair(a[0],a[1]);
    }
    if(n == 1) return make_pair(a[0],a[0]);

    pair<int,int> leftMaxMin, rightMaxMin;
    leftMaxMin = find(a, n>>1);
    rightMaxMin = find(a+(n>>1), n-(n>>1));
    return make_pair(leftMaxMin.first > rightMaxMin.first ? 
                     leftMaxMin.first : rightMaxMin.first ,
                     leftMaxMin.second < rightMaxMin.second ? 
                     leftMaxMin.second : rightMaxMin.second);
}

则在一次的findMaxMin调用中,最多比较四次,即
(1)if(n == 1)
(2)if(n == 2)
(3)leftMaxMin.first > rightMaxMin.first ? leftMaxMin.first : rightMaxMin.first
(4)leftMaxMin.second < rightMaxMin.second ? leftMaxMin.second : rightMaxMin.second
另一方面,由于二分,findMaxMin的调用次数为O(log2(n)),则总的比较次数O(4log2(n))


好吧,我真是2到家了,请无视ls的回复!

热点排行