简单的排序算法--最有效率

bhtfg538 2008-06-19 04:20:20
第一次来这个板块
最近在看数据结构算法(严蔚敏的)
请达人
指点
这个算法
两个线性表
{a,b,c,d}--a
{b,c,d,e,aa}--b
要求:要求把b表的元素加到a 不能与a的 重复
请大人 写最有效率的 算法
以及写出他的 时间复杂性
语言c# java js c
这是我写的两个简单的
----------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
DateTime dt = DateTime.Now;
ArrayList a=new ArrayList(){"a","b","c","d","gg","cc","dsd",};
ArrayList b = new ArrayList { "d", "a", "f", "g", "c", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd"};
ArrayList c=dos(a,b);
for (int i = 0; i < c.Count; i++)
{
Console.WriteLine(c[i]);
}
DateTime dt1=DateTime.Now;
TimeSpan ts;
ts = dt1 - dt;
Console.WriteLine(ts.ToString());
}
public static ArrayList dos(ArrayList a, ArrayList b)
{
bool has=false;
int y=0;
int al = a.Count;
int bl = b.Count;
for (int i = 0; i < al; i++)
{

for (int j = 0; j < bl; j++)
{
if (b[j] != a[i])
{
has = true;
y = i;
continue;
}
else
{
has = false;
break;
}

}
if (has)
{
b.Add(a[y]);
}

}
return b;
}
}
}
----------------------------------------------------------



---------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
DateTime dt = DateTime.Now;
ArrayList a = new ArrayList() { "a", "b", "c", "d", "gg", "cc", "dsd", };
ArrayList b = new ArrayList { "d", "a", "f", "g", "c", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd", "a", "b", "c", "d", "gg", "cc", "dsd" };
ArrayList c = dos(a, b);
for (int i = 0; i < c.Count; i++)
{
Console.WriteLine(c[i]);
}
DateTime dt1 = DateTime.Now;
TimeSpan ts;
ts = dt1 - dt;
Console.WriteLine(ts.ToString());
}
public static ArrayList dos(ArrayList a, ArrayList b)
{
string bstr = "";
for (int i = 0; i < b.Count; i++)
{
bstr += b[i].ToString() + ",";
}

for (int i = 0; i < a.Count; i++)
{
int asa = bstr.IndexOf(a[i].ToString());
if (asa == -1)
{
b.Add(a[i]);
}
else
{
continue;
}
}
return b;
}
}
}
...全文
125 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tailzhou 2008-06-20
  • 打赏
  • 举报
回复
对A排序的复杂度为o(nlogn)
对B中的每个元素在A中二分查找来判断是否重复的复杂度是o(mlogn)

所以总的复杂度为o((m+n)*logn)
tailzhou 2008-06-20
  • 打赏
  • 举报
回复
不然类似这样的数据,就会有问题
a{"aa","bb","cc"}
b("a","b","c"}
b并入a后,a还是原来的a;
tailzhou 2008-06-20
  • 打赏
  • 举报
回复
主要排序预处理需要o(nlogn)的时间,如果m比较小的时候,这个预处理就花太多时间了;

其实,要看你集合是用什么数据结构来表示的;

不过你的第二个程序有bug;

应该
string bstr = ","; //需要初始化为分割符","
for (int i = 0; i < b.Count; i++)
{
bstr += b[i].ToString() + ",";
}

for (int i = 0; i < a.Count; i++)
{
int asa = bstr.IndexOf(","+a[i].ToString()+"," ); //两边需要加上分割符;



bhtfg538 2008-06-20
  • 打赏
  • 举报
回复
谢谢大哥
明白了
O(n+m)logn是怎么来的 对 A
排序 的复杂度是?
这个是怎么来的
请指教
tailzhou 2008-06-20
  • 打赏
  • 举报
回复
看错,确实当m<logN的时候,
o(n*m)要比O(n+m)logn 效率好
tailzhou 2008-06-20
  • 打赏
  • 举报
回复
"这个方法我也写了 和 logn 成正比 如果n太大了 不是和第一种方法还要慢咯"


你的“第一种方法”的复杂度是o(n*m)的,当N很大的时候,远比O(n+m)logn效率低
bhtfg538 2008-06-20
  • 打赏
  • 举报
回复
3楼的 通知 你自己运行下~
有高见
像4楼一样 给 答案
假设A的长度为n,b的长度为m

最简单就是用hash;
比如c++里的set;
c#里的hashtable,dictionary等;
复杂度 O(n+m);

也可以先将A排序;然后对B的元素判断是否存在于A,不存在则插入A的尾部;
这样的复杂度为O(n+m)logn

4楼的大哥
‘’也可以先将A排序;然后对B的元素判断是否存在于A,不存在则插入A的尾部;
这样的复杂度为O(n+m)logn‘’
这个方法我也写了 和 logn 成正比 如果n太大了 不是和第一种方法还要慢咯
bhtfg538 2008-06-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bingyu9312 的回复:]
只看了第一个,提几点意见
1、从你的代码看,你好像是把a数组加到b数组
2、没有任何效率可言
3、实现错误。并且还有可能a中有重复元素,按照你的写法,a中重复元素都会被加到b中
修改如下:
for (int i = 0; i < al; i++)
{
has = false;
for (int j = 0; j < bl; j++)
{
if (b[j] == a[i])

[/Quote]
大哥 你自己测试没有
没有一个 重复
那是标准答案
如果你有高见 请贴出代码 不要 高谈大论
谢谢
bhtfg538 2008-06-20
  • 打赏
  • 举报
回复
太感谢了~JF】 ~~~~~~~~~~~~~~~~~~~~~
tailzhou 2008-06-19
  • 打赏
  • 举报
回复
假设A的长度为n,b的长度为m

最简单就是用hash;
比如c++里的set;
c#里的hashtable,dictionary等;
复杂度 O(n+m);

也可以先将A排序;然后对B的元素判断是否存在于A,不存在则插入A的尾部;
这样的复杂度为O(n+m)logn
听海潮2012 2008-06-19
  • 打赏
  • 举报
回复
只看了第一个,提几点意见
1、从你的代码看,你好像是把a数组加到b数组
2、没有任何效率可言
3、实现错误。并且还有可能a中有重复元素,按照你的写法,a中重复元素都会被加到b中
修改如下:
for (int i = 0; i < al; i++)
{
has = false;
for (int j = 0; j < bl; j++)
{
if (b[j] == a[i])
{
has = true;
break;
}
}
if (false==has)
{
b.Add(a[i]);
bl++;
}

}
DongloveRen 2008-06-19
  • 打赏
  • 举报
回复
bang mang ding !

hao tie!
bhtfg538 2008-06-19
  • 打赏
  • 举报
回复
朋友们 挺起来撒 帮我看看 顺便大家写下哦

33,008

社区成员

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

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