元素分组和排序问题

buyong 2009-04-30 09:42:28
元素分组和排序问题
大家好,这是我在实际工作中遇到的一个对集合中的元素分组和排序问题,现在我把它抽象如下:
输入:一个集合SET,里面有N个元素(A1,A2……An),用其中任意两个元素可以计算出一个关系值B,公式如下:
Bx = F(Ai, Aj);

输出:要求将SET里面的元素依据相似关系进行两两分组,并对这些分组按照关系值进行排序,得到
(<Aa,Ab>, <Ac,Ad>…..<Ay,Az>) //当N为偶数(Aa,Ab…Az ∈ SET)

(<Aa,Ab>, <Ac,Ad>…..<Az>) //当N为奇数

其中 F(Aa, Ab)为SET中任意两元素的最大关系值。F(Ac,Ad)为SET中除去Aa,Ab两元素以后的最大关系值,Ay,Az为最后两个元素(当N为偶数),Az为最后一个元素(当N为奇数)。

例如SET里有5个元素A1,A2,A3,A4,A5,其B值如下表:
A1 A2 A3 A4 A5
A1
A2 1
A3 2 3
A4 7 4 9
A5 8 6 10 5
则输出为(<A3,A5>, <A1,A4>, <A2>)。

以上应该是把需求写明白了。

想找一个复杂度为优于n2的算法。能写出思路或伪码即可,最好用C++实现的程序。
...全文
93 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
UDX协议 2009-06-03
  • 打赏
  • 举报
回复
是我的话,放到数据库里面,几个sql就搞定了。
flytomylife1 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hairetz 的回复:]
把SET的n个元素与其他n个元素(包括自己)的关系遍历一遍,复杂度为O(n),存入map < int,set <ele,ele>>里,当然set要重载 <号运算符,这里的int就已经是升序排序了。
[/Quote]

遍历一遍的话不是0(n^2)么?
为什么是O(n)呢?
并且为啥 存入map < int,set <ele,ele>> 之后就是升序了呢?

用map将两个字符和B值记录之后,用快排和插排结合的话应该很快的吧。
先快排,在区间较小的时候插排,,,

但是具体能有多快不晓得,楼下高人指点下呗O(∩_∩)O~
或者是更快的方法分享下。
绿色夹克衫 2009-04-30
  • 打赏
  • 举报
回复
这样的话,恐怕已经是n^2了!

[Quote=引用 3 楼 hairetz 的回复:]
把SET的n个元素与其他n个元素(包括自己)的关系遍历一遍,复杂度为O(n),存入map < int,set <ele,ele>>里,当然set要重载 <号运算符,这里的int就已经是升序排序了。
[/Quote]

如果F(Aa, Ab)的单调区间可以确定的话,可以用分治法降低运算的复杂度。
Paradin 2009-04-30
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
把SET的n个元素与其他n个元素(包括自己)的关系遍历一遍,复杂度为O(n),存入map< int,set<ele,ele>>里,当然set要重载<号运算符,这里的int就已经是升序排序了。
buyong 2009-04-30
  • 打赏
  • 举报
回复
很受启发
绿色夹克衫 2009-04-30
  • 打赏
  • 举报
回复
可能需要从F(Ai, Aj)这个函数的单调区间入手,判断Ai和F(Ai,M)的增减关系,
否则的话不要说n^2了,恐怕得n^3才行!
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 flytomylife1 的回复:]
引用 3 楼 hairetz 的回复:
把SET的n个元素与其他n个元素(包括自己)的关系遍历一遍,复杂度为O(n),存入map < int,set <ele,ele>>里,当然set要重载 <号运算符,这里的int就已经是升序排序了。


遍历一遍的话不是0(n^2)么?
为什么是O(n)呢?
并且为啥 存入map < int,set <ele,ele>> 之后就是升序了呢?

用map将两个字符和B值记录之后,用快排和插排结合的话应该很快的吧。
先快排,在区间较小的时候插排,,…
[/Quote]
打错了呢。。是O(n^^2)啊。。晕死

33,008

社区成员

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

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