免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cxytz01
打印 上一主题 下一主题

[算法] 求一取最大值得算法!!常见排序算法不要。 [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
41 [报告]
发表于 2013-01-10 14:28 |只看该作者
本帖最后由 yulihua49 于 2013-01-10 15:33 编辑
cxytz01 发表于 2013-01-10 11:20
不好意思,没描述清楚。 目前代码是1024。

后期系统升级,考虑到大并发量,需要同时接入上万个连接,就需 ...

你这个问题,实在应该用epoll,将来上万的连接,select如何吃得消?
最近有人提出使用select做大并发,理由是兼容。
我打算这么解决:
每个连接一个context,系统有context池。context里有fd;
凡连接的context的下标加入AVL树,以fd为key。AVL树里的max就是最大的fd。
这个AVL树很有用。每次从select里激活的fd,能快速找到它的context。
关闭的连接,从avl树里删除。
也可以用RB_tree.
虽然逃脱不了Nlog2(N)的命运,但是它是在连接时逐步建立的,分散的消耗时间,不显。

不过我也提建议,不主张select处理超过1536的连接。

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
42 [报告]
发表于 2013-01-10 15:37 |只看该作者
我只要1万个连接。不要多。

一刀。 发表于 2013-01-10 14:09
楼主还是先看看select/poll能不能做高并发服务器吧

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
43 [报告]
发表于 2013-01-10 15:39 |只看该作者
如果要做,在加个线程池,能上多少?

描述里面说清楚了,不用epoll,否则不会讨论什么maxfd的比较。

cxytz01 发表于 2013-01-10 15:37
我只要1万个连接。不要多。

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
44 [报告]
发表于 2013-01-10 15:44 |只看该作者
本帖最后由 cxytz01 于 2013-01-10 15:46 编辑

你好,epool + aio能够很轻易的做成大并发的服务器。

现在我想考虑的是偏要用select能不能做做到高效率的服务(1~2w吧)。

记得unp上作者的n个回射服务器的例子, 一个单线程的select + 非阻塞io,比多线程阻塞io,快了好像是2倍。但是算法复杂了。

所以是想考虑有什么好的算法可以搞出个好的服务器来。


请问系统context池是什么?

yulihua49 发表于 2013-01-10 14:28
你这个问题,实在应该用epoll,将来上万的连接,select如何吃得消?
最近有人提出使用select做大并发,理 ...

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
45 [报告]
发表于 2013-01-10 15:53 |只看该作者
folklore 发表于 2013-01-10 13:24
@cxytz01
hehe, dandingIng

想想“堆排序”算法中里那个堆是怎么形成的

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
46 [报告]
发表于 2013-01-10 16:41 |只看该作者
本帖最后由 yulihua49 于 2013-01-10 19:52 编辑
cxytz01 发表于 2013-01-10 15:44
你好,epool + aio能够很轻易的做成大并发的服务器。

现在我想考虑的是偏要用select能不能做做到高效率 ...

context称为“上下文”,按需要定义其内容(里边至少要有一个fd吧?),也可以称为“session”,用来表达任务状态。
通常是一个结构体。多个结构体组成一个数组,称为“池”。
每一个连接进入后,按照所需的业务流程,定义其状态,一步一步的完成作业。


我很怀疑select能做上万?
光是激活后找到激活的fd就是不小的开销。
然后用这个fd找到context,然后根据context的状态调用相应的处理程序。
一般是accept后,,分配一个context,加入avl树,将fd加入FD_set.......
这些必须单线程做,上万?时间都干这个了,能有什么吞吐量?

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
47 [报告]
发表于 2013-01-10 16:55 |只看该作者
回复 26# cxytz01


    你不是找最大值么?怎么用排序啊?

如果你想把最大值放在最前面的话,最简单的是依次选择最大值,放在另一个数组里,然后交换两个数组的指针,这是最简单的,不过经常修改的数组没必要去排序,那样排序浪费的时间也很大;
提高效率的话,还有一个办法,就是用宏替换的方法,把函数定义成宏,然后调用的地方使用宏名,让编译器依次去替换各个函数

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
48 [报告]
发表于 2013-01-10 18:09 |只看该作者
@windoze用堆的话是log(n),
前提是本身有序。 此外,堆重整也要时间。
所以,堆适用于不关心数据的index, 取值远大于设值的情况。

不然, 用链表保存少量的非-1元素是最有效算法。 复杂变 n

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
49 [报告]
发表于 2013-01-10 18:11 |只看该作者
回复 39# windoze


    最初建堆是nlog(n),此后第次设值, 要log(n)来Adjust

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
50 [报告]
发表于 2013-01-10 19:02 |只看该作者
回复 49# folklore
所以你的方案就变成了两个步骤,第一要确定数据是否有序,第二才是取最大值。
第一个步骤需要n log(n)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP