【 在 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 : ...................
【 在 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 : ...................
【 在 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 : ...................
【 在 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 : ...................
【 在 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 : ...................
【 在 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 : ...................
你在搞笑么,你就是有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 : ...................
还是使用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数量级。
咋办?有啥好办法?
先多谢各位大神指点迷津!
要求提供数据的人,数组中不能有大于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
: ...................
并行 最简单的办法 手动并行 把数据切割开 放到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
: ...................
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
: ...................
为嘛不先sort再选?
因为lz没你这么傻
少说两句别丢人了
【 在 skl(屎壳郎) 的大作中提到: 】
: 为嘛不先sort再选?
最快的sort也不会比lz的code更快。
【 在 skl (屎壳郎) 的大作中提到: 】
: 为嘛不先sort再选?
能想象到更快的只能是内存地址指针。每个数组元素放到
一个指定的有固定位数的地址。所有元素全都放好。用汇
编直接从每个最高位开始跑一遍,然后下一位,直到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
: ...................
属实 尼玛闹笑话了L0L
【 在 llaalways(熊大) 的大作中提到: 】
: 最快的sort也不会比lz的code更快。
你这个算法可行,尼玛他那个估计数组比内存都大,如果领导不介意也可以放到excel
上跑,多开几台电脑,用excel的lookup功能。
【 在 Huangchong(净坛使者) 的大作中提到: 】
<br>: 并行 最简单的办法 手动并行 把数据切割开 放到100个电脑上跑
LOL
<br>
看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL
估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL
【 在 skl (屎壳郎) 的大作中提到: 】
: 你这个算法可行,尼玛他那个估计数组比内存都大,如果领导不介意也可以放到
excel
: 上跑,多开几台电脑,用excel的lookup功能。
:
: 并行 最简单的办法 手动并行 把数据切割开 放到100个电脑上跑
: LOL
:
看起来数据没有前后依赖关系
就你那办法靠谱了,hash一下(或者直接用下表当hash值,然后根据hash值求模平均分
配到不同机器去算
【 在 Huangchong (净坛使者) 的大作中提到: 】
: 看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL
: 估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL
: excel
我也脚着楼主一定隐瞒了啥,数组到底有多大也没说清楚,几个鸡还是几个败?LoL
【 在 Huangchong(净坛使者) 的大作中提到: 】
: 看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL
: 估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL
: excel
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
: ...................
您的意思是散列搜索,先搞个hash表格,对吗?为什么你绝不会这么做?请指点迷津,多谢。
【 在 GoodToCU (宛如初见) 的大作中提到: 】
: 能想象到更快的只能是内存地址指针。每个数组元素放到
: 一个指定的有固定位数的地址。所有元素全都放好。用汇
: 编直接从每个最高位开始跑一遍,然后下一位,直到c的
: 非零最高位。
: 想象而已。我绝不会去做。
恩,你说的没错,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。具体结构和大小如下:
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
:
高手,麻烦看一下,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。具体结构和大小如下:
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值求模平均分
: 配到不同机器去算
尼玛这是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
: ...................
第一层10^9,第二层10^7,
10^7个数做个排序能用多少时间?完全能在内存里做啊。后面就是二分查找比O(N)要快多了
一图胜千言,请把你的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
: ...................
【 在 skl (屎壳郎) 的大作中提到: 】
: 一图胜千言,请把你的N1和N2标出,tt uu 各行和各列的size也最好能标出。
+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)要
: 快多了
你在搞笑么,你就是有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
: ...................
。。。。。
【 在 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
: ...................