求教:从数组中挑选数据

f
ftmit
楼主 (未名空间)

还是使用Fortran,没法子,各位大神就多担待一下吧。

有一个数组A(n),挑选出大于b,并且小于c的元素。

do i = 1, n
if ((A(i).gt.b).and.(A(i).lt.c)) then
.......
.......
.......
Else
End if
End do

如果使用上边的方式,是可以出结果的,问题是计算时间太长了。(因为数组实在是太大了),估计一个月能跑出一个样品数据就不错了。各位大神有没有什么更好的办法?只求缩短计算时间。

先谢谢各位大神了!

.........................................
更新一下:

这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。具体结构和大小如下:

do i = 1, N1 !大小在10^9数量级

b(i) = ......
c(i) = ......

do j = 1, N2 !大小在10^7数量级

if ((A(j).gt.b(i)).and.(A(j).lt.c(i))) then
.......
.......

else
endif

enddo
enddo

其中,N1是整个流场模型的位置模拟取样点,大小在10^9数量级。
N2 (或者A(j))是模拟另外一个控制条件,大小在10^7数量级。

咋办?有啥好办法?

先多谢各位大神指点迷津!

c
ccartman

要求提供数据的人,数组中不能有大于b小于c的元素。

【 在 ftmit (八戒) 的大作中提到: 】
: 还是使用Fortran,没法子,各位大神就多担待一下吧。
: 有一个数组A(n),挑选出大于b,并且小于c的元素。
: do i = 1, n
: if ((A(i).gt.b).and.(A(i).lt.c)) then
: .......
: .......
: .......
: Else
: End if
: End do
: ...................

H
Huangchong

并行 最简单的办法 手动并行 把数据切割开 放到100个电脑上跑LOL

【 在 ftmit (八戒) 的大作中提到: 】
: 还是使用Fortran,没法子,各位大神就多担待一下吧。
: 有一个数组A(n),挑选出大于b,并且小于c的元素。
: do i = 1, n
: if ((A(i).gt.b).and.(A(i).lt.c)) then
: .......
: .......
: .......
: Else
: End if
: End do
: ...................

H
Huangchong

fortran比大小怎么可能慢 估计fortran程序本身根汇编程序的语句数量一样LOL
你不会是在每个循环里都重新把计算又做了一遍吧LOL

【 在 ftmit (八戒) 的大作中提到: 】
: 还是使用Fortran,没法子,各位大神就多担待一下吧。
: 有一个数组A(n),挑选出大于b,并且小于c的元素。
: do i = 1, n
: if ((A(i).gt.b).and.(A(i).lt.c)) then
: .......
: .......
: .......
: Else
: End if
: End do
: ...................

s
skl

为嘛不先sort再选?

B
BroPingtou

因为lz没你这么傻

少说两句别丢人了

【 在 skl(屎壳郎) 的大作中提到: 】

: 为嘛不先sort再选?

l
llaalways

最快的sort也不会比lz的code更快。
【 在 skl (屎壳郎) 的大作中提到: 】
: 为嘛不先sort再选?

G
GoodToCU

能想象到更快的只能是内存地址指针。每个数组元素放到
一个指定的有固定位数的地址。所有元素全都放好。用汇
编直接从每个最高位开始跑一遍,然后下一位,直到c的
非零最高位。

想象而已。我绝不会去做。

【 在 ftmit (八戒) 的大作中提到: 】
: 还是使用Fortran,没法子,各位大神就多担待一下吧。
: 有一个数组A(n),挑选出大于b,并且小于c的元素。
: do i = 1, n
: if ((A(i).gt.b).and.(A(i).lt.c)) then
: .......
: .......
: .......
: Else
: End if
: End do
: ...................

s
skl

属实 尼玛闹笑话了L0L

【 在 llaalways(熊大) 的大作中提到: 】

: 最快的sort也不会比lz的code更快。

s
skl

你这个算法可行,尼玛他那个估计数组比内存都大,如果领导不介意也可以放到excel
上跑,多开几台电脑,用excel的lookup功能。

【 在 Huangchong(净坛使者) 的大作中提到: 】
<br>: 并行 最简单的办法 手动并行 把数据切割开 放到100个电脑上跑
LOL
<br>

H
Huangchong

看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL

估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL

【 在 skl (屎壳郎) 的大作中提到: 】
: 你这个算法可行,尼玛他那个估计数组比内存都大,如果领导不介意也可以放到
excel
: 上跑,多开几台电脑,用excel的lookup功能。
:
: 并行 最简单的办法 手动并行 把数据切割开 放到100个电脑上跑
: LOL
:

B
BroPingtou

看起来数据没有前后依赖关系

就你那办法靠谱了,hash一下(或者直接用下表当hash值,然后根据hash值求模平均分
配到不同机器去算

【 在 Huangchong (净坛使者) 的大作中提到: 】
: 看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL
: 估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL
: excel

s
skl

我也脚着楼主一定隐瞒了啥,数组到底有多大也没说清楚,几个鸡还是几个败?LoL

【 在 Huangchong(净坛使者) 的大作中提到: 】

: 看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL

: 估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL

: excel

z
zeami

AWK !! 上古神器啊
几月前贴过的居然被钻风删了
这样告诉你,7800个文件,每个文件几万行数据
一个小时处理完了

【 在 ftmit (八戒) 的大作中提到: 】
: 还是使用Fortran,没法子,各位大神就多担待一下吧。
: 有一个数组A(n),挑选出大于b,并且小于c的元素。
: do i = 1, n
: if ((A(i).gt.b).and.(A(i).lt.c)) then
: .......
: .......
: .......
: Else
: End if
: End do
: ...................

f
ftmit

您的意思是散列搜索,先搞个hash表格,对吗?为什么你绝不会这么做?请指点迷津,多谢。

【 在 GoodToCU (宛如初见) 的大作中提到: 】
: 能想象到更快的只能是内存地址指针。每个数组元素放到
: 一个指定的有固定位数的地址。所有元素全都放好。用汇
: 编直接从每个最高位开始跑一遍,然后下一位,直到c的
: 非零最高位。
: 想象而已。我绝不会去做。

f
ftmit

恩,你说的没错,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。具体结构和大小如下:

do i = 1, N1 !大小在10^9数量级

b(i) = ......
c(i) = ......

do j = 1, N2 !大小在10^7数量级

if ((A(j).gt.b(i)).and.(A(j).lt.c(i))) then
.......
.......

else
endif

enddo
enddo

其中,N1是整个流场模型的位置模拟取样点,大小在10^9数量级。
N2 (或者A(j))是模拟另外一个控制条件,大小在10^7数量级。

咋办?有啥好办法?

先多谢各位大神指点迷津!

【 在 skl (屎壳郎) 的大作中提到: 】
: 我也脚着楼主一定隐瞒了啥,数组到底有多大也没说清楚,几个鸡还是几个败?LoL
:
: 看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL
:
: 估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL
:
: excel
:

f
ftmit

高手,麻烦看一下,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。具体结构和大小如下:

do i = 1, N1 !大小在10^9数量级

b(i) = ......
c(i) = ......

do j = 1, N2 !大小在10^7数量级

if ((A(j).gt.b(i)).and.(A(j).lt.c(i))) then
.......
.......

else
endif

enddo
enddo

其中,N1是整个流场模型的位置模拟取样点,大小在10^9数量级。
N2 (或者A(j))是模拟另外一个控制条件,大小在10^7数量级。

咋办?有啥好办法?

先多谢各位大神指点迷津!

【 在 BroPingtou (ǢŦĦȆȐ) 的大作中提到: 】
: 看起来数据没有前后依赖关系
: 就你那办法靠谱了,hash一下(或者直接用下表当hash值,然后根据hash值求模平均分
: 配到不同机器去算

s
skl

尼玛这是N平方,怪不得,否则linear有啥好算得,你那个本身就是最优算法。等我忙
完回头和你算

【 在 ftmit (八戒) 的大作中提到: 】
: 恩,你说的没错,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。具
: 体结构和大小如下:
: do i = 1, N1 !大小在10^9数量级
: b(i) = ......
: c(i) = ......
: do j = 1, N2 !大小在10^7数量级
: if ((A(j).gt.b(i)).and.(A(j).lt.c(i))) then
: .......
: .......
: else
: ...................

f
flangdream

第一层10^9,第二层10^7,
10^7个数做个排序能用多少时间?完全能在内存里做啊。后面就是二分查找比O(N)要快多了

s
skl

一图胜千言,请把你的N1和N2标出,tt uu 各行和各列的size也最好能标出。

【 在 ftmit (八戒) 的大作中提到: 】
: 还是使用Fortran,没法子,各位大神就多担待一下吧。
: 有一个数组A(n),挑选出大于b,并且小于c的元素。
: do i = 1, n
: if ((A(i).gt.b).and.(A(i).lt.c)) then
: .......
: .......
: .......
: Else
: End if
: End do
: ...................

s
skl


【 在 skl (屎壳郎) 的大作中提到: 】
: 一图胜千言,请把你的N1和N2标出,tt uu 各行和各列的size也最好能标出。

l
llaalways

+1
这种情况下,先对A做个quicksort,就能省时间了。
数值比较的cost 从10^9 x 10^7 减少到 (10^9 + 10^7 )x log (10^7).

但其他的在if else endif 里面的cost 还是10^9 x 10^7。
不知道if else endif 里面是不是需要针对每一组b,c 和a 重复。
如果是的,可以说优化没有意义。应为总工作量是10^9 x 10^7, 不可能减少。

如果只是统计有多少 a(j) 是在b(i)和c(i)之间, 则可以省掉a(j)循环。
用凉粉发之间找出sort后的第1个和最后一个在b(i)和c(i)之间的a(j)。

【 在 flangdream (fropen) 的大作中提到: 】
: 第一层10^9,第二层10^7,
: 10^7个数做个排序能用多少时间?完全能在内存里做啊。后面就是二分查找比O(N)要
: 快多了

d
daemonself

你在搞笑么,你就是有1TB的数据也就1小时就搞定了,难道你有PB级别的数据
【 在 ftmit (八戒) 的大作中提到: 】
: 还是使用Fortran,没法子,各位大神就多担待一下吧。
: 有一个数组A(n),挑选出大于b,并且小于c的元素。
: do i = 1, n
: if ((A(i).gt.b).and.(A(i).lt.c)) then
: .......
: .......
: .......
: Else
: End if
: End do
: ...................

d
daemonself

。。。。。
【 在 ftmit (八戒) 的大作中提到: 】
: 高手,麻烦看一下,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。
: 具体结构和大小如下:
: do i = 1, N1 !大小在10^9数量级
: b(i) = ......
: c(i) = ......
: do j = 1, N2 !大小在10^7数量级
: if ((A(j).gt.b(i)).and.(A(j).lt.c(i))) then
: .......
: .......
: else
: ...................