找回密码
 注册
LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 2426|回复: 5

如何求两个集合的交集?

[复制链接]
akensir 该用户已被删除
发表于 2007-12-26 08:36:29 | 显示全部楼层 |阅读模式
我的labview程序中需要计算两个array中元素的交集,有现成的子程序吗?没有该如何实现?多谢!
发表于 2007-12-26 14:43:00 | 显示全部楼层
所谓算法,就是把你的思想用程序表达出来,或者,算法就是思想~

比如求两个集合的交集,那么,你可以这样来做:
假设集合A,B
取集合a的第一个元素a1,在集合b里看看,有没和它(a1)相等的(这里需要假设在一个集合内部,元素互相是不同的),如果有,记录该元素,然后取集合a的第二个元素a2... ...

算法也需要讲究效率,真正的解决这个具体问题的算法,应该不是我说的这样的(因为它太低效了),不过如果就我这个方法而言,有如下的讨论:

假设集合A的元素个数是n,集合B的元素个数是m,交集元素个数是h,并且假设m<n
则最大可能比较次数为m+(m-1)+...+(m-h+1)=(2m+1-h)/2

现在以集合B的元素作为索引来到集合A中寻找匹配(A、B集合角色对调)
则最大可能比较次数为(2n+1-h)/2

明显不如第一种效率高,做个程序测试下?

                             

运行test_main.vi,可以看到,两者耗时相差之大!如果在后面板上把大数组的元素增加(就是for循环的200改为1000,比如说),那么,可以看到,其中一个,耗时几乎曾线性增加,而另外一个几乎没什么变化~~~~

当然了,真正的算法不可能像我写的这么笨的,以上的程序,只是一个简单的演示,用来说明算法效率的重要性而已~~~~

[ 本帖最后由 飞雨天 于 2007-12-26 15:01 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 顶

使用道具 举报

发表于 2007-12-26 16:10:28 | 显示全部楼层
我做了个交集的程序,使用了两个while循环,我觉得程序还有很多不足的地方,就算法我也说不出什么来,感觉就是减少程序的计算次数就好了。原本是使用for来做,可是发现会将相同的元素都插入到交集的结果中,导致重复出现。飞雨天的程序还没拜读,我的是7.1的打不开,请飞雨天指点点。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 顶

使用道具 举报

发表于 2007-12-26 17:20:22 | 显示全部楼层
程序经过一段时间修改,我师妹提出更简单的办法,先把图片截取效果如下,计算复杂度减少了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 顶

使用道具 举报

发表于 2007-12-26 17:47:37 | 显示全部楼层
呵呵,我瞎写的,这里无法保存7.1的,我截图好了~~~

这个是主程序后面板:
   


这个是子程序后面板:



[ 本帖最后由 飞雨天 于 2007-12-26 17:50 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 顶

使用道具 举报

发表于 2008-1-10 16:55:56 | 显示全部楼层
帮你改了一下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 顶

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2026-9-30 12:34 , Processed in 0.040738 second(s), 13 queries , Gzip On, File On.

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表