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

CaspianSea 2013-01-24 09:20:44
要求: 1. 不用排序算法
2. 时间复杂度最坏情况下为O(n^2)
我没有想到有好的方法,请大师赐教.
...全文
324 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
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的期望复杂度。
dracularking 2013-01-25
  • 打赏
  • 举报
回复
递归不过是形式,为什么要递归嗯,我觉得算这个最坏也不过O(n^2)了吧
dracularking 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;

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧