由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Joke版 - 求教:从数组中挑选数据
进入Joke版参与讨论
1 (共1页)
f***t
发帖数: 2247
1
还是使用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
如果使用上边的方式,是可以出结果的,问题是计算时间太长了。(因为数组实在是太
大了),估计一个月能跑出一个样品数据就不错了。各位大神有没有什么更好的办法?
只求缩短计算时间。
先谢谢各位大神了!
c******n
发帖数: 891
2
要求提供数据的人,数组中不能有大于b小于c的元素。

【在 f***t 的大作中提到】
: 还是使用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********g
发帖数: 43926
3
并行 最简单的办法 手动并行 把数据切割开 放到100个电脑上跑LOL

【在 f***t 的大作中提到】
: 还是使用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********g
发帖数: 43926
4
fortran比大小怎么可能慢 估计fortran程序本身根汇编程序的语句数量一样LOL
你不会是在每个循环里都重新把计算又做了一遍吧LOL

【在 f***t 的大作中提到】
: 还是使用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*l
发帖数: 9421
5
为嘛不先sort再选?
B********u
发帖数: 1
6
因为lz没你这么傻
少说两句别丢人了


: 为嘛不先sort再选?



【在 s*l 的大作中提到】
: 为嘛不先sort再选?
l*******s
发帖数: 7316
7
最快的sort也不会比lz的code更快。

【在 s*l 的大作中提到】
: 为嘛不先sort再选?
G******U
发帖数: 4211
8
能想象到更快的只能是内存地址指针。每个数组元素放到
一个指定的有固定位数的地址。所有元素全都放好。用汇
编直接从每个最高位开始跑一遍,然后下一位,直到c的
非零最高位。
想象而已。我绝不会去做。

【在 f***t 的大作中提到】
: 还是使用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*l
发帖数: 9421
9
属实 尼玛闹笑话了L0L


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



【在 l*******s 的大作中提到】
: 最快的sort也不会比lz的code更快。
s*l
发帖数: 9421
10
你这个算法可行,尼玛他那个估计数组比内存都大,如果领导不介意也可以放到excel
上跑,多开几台电脑,用excel的lookup功能。


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



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

H********g
发帖数: 43926
11
看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL
估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL

excel

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

B********u
发帖数: 1
12
看起来数据没有前后依赖关系
就你那办法靠谱了,hash一下(或者直接用下表当hash值,然后根据hash值求模平均分
配到不同机器去算

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

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


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

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

: excel



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

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

【在 f***t 的大作中提到】
: 还是使用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***t
发帖数: 2247
15
您的意思是散列搜索,先搞个hash表格,对吗?为什么你绝不会这么做?请指点迷津,
多谢。

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

f***t
发帖数: 2247
16
恩,你说的没错,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。具
体结构和大小如下:
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数量级。
咋办?有啥好办法?
先多谢各位大神指点迷津!

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

f***t
发帖数: 2247
17
高手,麻烦看一下,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。
具体结构和大小如下:
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数量级。
咋办?有啥好办法?
先多谢各位大神指点迷津!

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

s*l
发帖数: 9421
18
尼玛这是N平方,怪不得,否则linear有啥好算得,你那个本身就是最优算法。等我忙
完回头和你算

【在 f***t 的大作中提到】
: 恩,你说的没错,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。具
: 体结构和大小如下:
: 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********m
发帖数: 1
19
第一层10^9,第二层10^7,
10^7个数做个排序能用多少时间?完全能在内存里做啊。后面就是二分查找比O(N)要
快多了
s*l
发帖数: 9421
20
一图胜千言,请把你的N1和N2标出,tt uu 各行和各列的size也最好能标出。

【在 f***t 的大作中提到】
: 还是使用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*l
发帖数: 9421
21


【在 s*l 的大作中提到】
: 一图胜千言,请把你的N1和N2标出,tt uu 各行和各列的size也最好能标出。
l*******s
发帖数: 7316
22
+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)。

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

d********f
发帖数: 43471
23
你在搞笑么,你就是有1TB的数据也就1小时就搞定了,难道你有PB级别的数据

【在 f***t 的大作中提到】
: 还是使用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********f
发帖数: 43471
24
。。。。。

【在 f***t 的大作中提到】
: 高手,麻烦看一下,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。
: 具体结构和大小如下:
: 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

1 (共1页)
进入Joke版参与讨论