楼主: lastwinner

[精华] sql求解200万内质数各种算法点评

[复制链接]
论坛徽章:
0
31#
发表于 2014-3-21 20:20 | 只看该作者
如果只是求个数,目前最快的算法是根据sqrt(n)以内的素数就可以推算出n以内的个数。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
32#
发表于 2014-3-21 22:04 | 只看该作者
winxos 发表于 2014-3-21 20:20
如果只是求个数,目前最快的算法是根据sqrt(n)以内的素数就可以推算出n以内的个数。

思路挺不错,但是具体怎么推算?还得对所有素数因子的组合做乘法吧?

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
33#
 楼主| 发表于 2014-3-22 01:14 | 只看该作者
winxos 发表于 2014-3-21 20:20
如果只是求个数,目前最快的算法是根据sqrt(n)以内的素数就可以推算出n以内的个数。

能么?
如果能,也是个大概数吧

使用道具 举报

回复
论坛徽章:
9
2011新春纪念徽章
日期:2011-02-18 11:43:33ITPUB 11周年纪念徽章
日期:2012-10-10 13:11:142013年新春福章
日期:2013-02-25 14:51:24秀才
日期:2016-06-23 14:15:06秀才
日期:2017-03-20 13:42:20秀才
日期:2017-03-28 15:11:09秀才
日期:2017-03-28 15:59:38秀才
日期:2017-04-06 18:09:28秀才
日期:2017-07-11 14:19:35
34#
发表于 2014-3-24 20:15 | 只看该作者
分析的有理有据。

使用道具 举报

回复
论坛徽章:
9
生肖徽章2007版:羊
日期:2009-08-24 09:30:46ITPUB9周年纪念徽章
日期:2010-10-08 09:32:252011新春纪念徽章
日期:2011-02-18 11:42:49SQL大赛参与纪念
日期:2011-04-13 12:08:17ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31奥运纪念徽章
日期:2012-12-06 09:21:402013年新春福章
日期:2013-02-25 14:51:24
35#
发表于 2014-3-25 19:35 | 只看该作者
-- 贴个用“存储过程”的写法:

CREATE TYPE prime_ot AS OBJECT
(  prime_num NUMBER(38,0)
)
/

-- 创建这个对象的集合,用于定义函数的返回值类型
CREATE TYPE prime_nnt AS TABLE OF prime_ot
/

-- 创建临时表,用以存放素数
CREATE GLOBAL TEMPORARY TABLE tmp_prime(
  prime_num NUMBER(38,0)
)
ON COMMIT DELETE ROWS;


CREATE OR REPLACE PROCEDURE pro_prime(i_end_num in number, o_cur OUT SYS_REFCURSOR)
IS
  CURSOR l_prime_cur(c_end_num in number)
  IS
    SELECT 3+(level-1)*2 as prime_num
    FROM dual
    CONNECT BY level<(c_end_num/2);

  TYPE l_prime_aat IS TABLE OF l_prime_cur%ROWTYPE
    INDEX BY BINARY_INTEGER;
  l_prime_curs l_prime_aat;
  l_prime_ot prime_ot := prime_ot(NULL);

  TYPE l_prime_aat2 IS TABLE OF l_prime_cur%ROWTYPE
    INDEX BY BINARY_INTEGER;
  l_prime_curs2 l_prime_aat2;
  l_prime_ot2 prime_ot := prime_ot(NULL);

  CURSOR l_prime_print
  IS
    SELECT prime_num
    FROM dbmon.tmp_prime
    ORDER BY prime_num;

  l_is_prime NUMBER(10,0);
  v_prime_num NUMBER(38,0);

BEGIN
  TRUNCATE TABLE dbmon.tmp_prime;
  IF i_end_num>=3 THEN
    OPEN l_prime_cur(i_end_num);
    LOOP
      FETCH l_prime_cur BULK COLLECT INTO l_prime_curs LIMIT 2000;
        FOR l_row IN 1..l_prime_curs.COUNT
        LOOP
          v_prime_num := l_prime_curs(l_row).prime_num;
          SELECT COUNT(1) INTO l_is_prime
          FROM tmp_prime t1
          WHERE t1.prime_num<=SQRT(v_prime_num)+1
            AND mod(v_prime_num,t1.prime_num)=0;

          IF l_is_prime=0 THEN
            INSERT INTO dbmon.tmp_prime(prime_num) VALUES(v_prime_num);
          END IF;
        END LOOP;
      EXIT WHEN l_prime_cur%NOTFOUND;
    END LOOP;
    CLOSE l_prime_cur;
    INSERT INTO  tmp_prime(prime_num) VALUES(2);
  END IF;

  OPEN o_cur FOR 'SELECT prime_num FROM dbmon.tmp_prime order by prime_num';
EXCEPTION WHEN OTHERS THEN
  CLOSE l_prime_cur;
END;
/

-------------

set serveroutput on;
var c_cur refcursor;
exec dbmon.pro_prime(20000,:c_cur);
print c_cur;

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
36#
 楼主| 发表于 2014-3-26 00:45 | 只看该作者
luoyoumou 发表于 2014-3-25 19:35
-- 贴个用“存储过程”的写法:

CREATE TYPE prime_ot AS OBJECT

嗯,递归做起来容易很多了
你测过效率对比没?

使用道具 举报

回复
论坛徽章:
9
生肖徽章2007版:羊
日期:2009-08-24 09:30:46ITPUB9周年纪念徽章
日期:2010-10-08 09:32:252011新春纪念徽章
日期:2011-02-18 11:42:49SQL大赛参与纪念
日期:2011-04-13 12:08:17ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31奥运纪念徽章
日期:2012-12-06 09:21:402013年新春福章
日期:2013-02-25 14:51:24
37#
发表于 2014-3-28 19:47 | 只看该作者
lastwinner 发表于 2014-3-26 00:45
嗯,递归做起来容易很多了
你测过效率对比没?

效率当然是你的高,扛扛的。

使用道具 举报

回复
论坛徽章:
9
生肖徽章2007版:羊
日期:2009-08-24 09:30:46ITPUB9周年纪念徽章
日期:2010-10-08 09:32:252011新春纪念徽章
日期:2011-02-18 11:42:49SQL大赛参与纪念
日期:2011-04-13 12:08:17ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31奥运纪念徽章
日期:2012-12-06 09:21:402013年新春福章
日期:2013-02-25 14:51:24
38#
发表于 2014-3-28 19:48 | 只看该作者
lastwinner 发表于 2014-3-26 00:45
嗯,递归做起来容易很多了
你测过效率对比没?

效率当然是你的高,扛扛的。

使用道具 举报

回复
论坛徽章:
9
生肖徽章2007版:羊
日期:2009-08-24 09:30:46ITPUB9周年纪念徽章
日期:2010-10-08 09:32:252011新春纪念徽章
日期:2011-02-18 11:42:49SQL大赛参与纪念
日期:2011-04-13 12:08:17ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31奥运纪念徽章
日期:2012-12-06 09:21:402013年新春福章
日期:2013-02-25 14:51:24
39#
发表于 2014-3-28 19:50 | 只看该作者
lastwinner 发表于 2014-3-26 00:45
嗯,递归做起来容易很多了
你测过效率对比没?

效率当然是你的高,扛扛的。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
40#
 楼主| 发表于 2014-3-29 12:33 | 只看该作者
luoyoumou 发表于 2014-3-28 19:47
效率当然是你的高,扛扛的。

要这样说,那pl/sql里你采取小批量处理的策略,而不是一个一个去处理,会快更多

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表