用递归算法求解数组有没有相同元素的问题

CaspianSea 2013-01-24 09:20:44
要求: 1. 不用排序算法
2. 时间复杂度最坏情况下为O(n^2)
我没有想到有好的方法,请大师赐教.
...全文
249 11 点赞 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
amdgaming 2013-01-29
用 hash吧 key 是数组元素, vaule是 key出现的次数 遍历一次 插入hash 然后编译一次hash,取出vaule >1 即可
  • 打赏
  • 举报
回复
kosora曹 2013-01-29
引用 9 楼 amdgaming 的回复:
用 hash吧 key 是数组元素, vaule是 key出现的次数 遍历一次 插入hash 然后编译一次hash,取出vaule >1 即可
对于1、99999、345、1000、1000000、9867这种数组,与桶相关的哈希表、基数排序等等,都不是好方法,因为会浪费大量的0元素空间,普通BST的插入算法完全可以应对,插入的时候重复的节点的count++。
  • 打赏
  • 举报
回复
ykmao10 2013-01-29
基数排序 后再遍历一遍 找到前后相同的不就行了 o(n) + o(n) ,只要o(n)就行了,为什么要用递归
  • 打赏
  • 举报
回复
kosora曹 2013-01-26
BST的插入,课本上的例题。
  • 打赏
  • 举报
回复
kosora曹 2013-01-26
引用 5 楼 acidsweet 的回复:
好奇怪的问题,要是使用映射O(n)就成了,但是偏要递归的话,那么就是考基数排序的变种了呢.... 由于相同的数肯定会落入同一个筒中,所以最后每个桶中元素>1的话就是有相同,反之没有,算法复杂度是多项式级的
个人认为此题不可用桶,万一数组是1、99999、345、1000、1000000、9867这种情况,消耗的辅助空间就是一百万。对付重复元素,用BST就行,Nlog2N的期望复杂度。
  • 打赏
  • 举报
回复
科學信仰 2013-01-25
递归不过是形式,为什么要递归嗯,我觉得算这个最坏也不过O(n^2)了吧
  • 打赏
  • 举报
回复
科學信仰 2013-01-25
引用 5 楼 acidsweet 的回复:
好奇怪的问题,要是使用映射O(n)就成了,但是偏要递归的话,那么就是考基数排序的变种了呢.... 由于相同的数肯定会落入同一个筒中,所以最后每个桶中元素>1的话就是有相同,反之没有,算法复杂度是多项式级的
是啊 能空间换时间的问题貌似有一定条件
  • 打赏
  • 举报
回复
acidsweet 2013-01-25
好奇怪的问题,要是使用映射O(n)就成了,但是偏要递归的话,那么就是考基数排序的变种了呢.... 由于相同的数肯定会落入同一个筒中,所以最后每个桶中元素>1的话就是有相同,反之没有,算法复杂度是多项式级的
  • 打赏
  • 举报
回复
百分百好牛 2013-01-25
#2楼的是对的。呵,这个问题感觉就比较奇怪......
  • 打赏
  • 举报
回复
阿麦 2013-01-24
递归算法啊。

bool Exist(int value, int* pv, int Len)
{
    if (Len <= 0)
    {
        return false;
    }
    if (value == pv[0])
    {
        return true;
    }
    else
    {
        return Exist(value, pv+1, Len-1);
    }
}

bool Exist(int* pv, int Len)
{
    for (int i = 0; i < Len-1; ++i)
    {
        if (Exist(pv[i], pv+i+1, Len-i-1))
        {
            return true;
        }
    }
    return false;
}

int main()
{
    int a[5] = {1, 2, 3, 4, 2};
    if (Exist(a, 5))
    {
        cout << "有相同" << endl;
    }
    else
    {
        cout << "没有相同" << endl;
    }
}
  • 打赏
  • 举报
回复
阿麦 2013-01-24
O(N^2)的条件太宽松了, static const int size = 5; int a[size] = {1,2,3,4,3}; for (int i = 0; i < size-1; ++i) { for (int j = i+1; j < size; ++j) { if (a[i] == a[j]) { return true; } } } return false;
  • 打赏
  • 举报
回复
相关推荐
发帖
数据结构与算法
加入

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2013-01-24 09:20
社区公告
暂无公告