【发布时间】:2016-02-10 00:28:52
【问题描述】:
我必须通过修改长文件来恢复和old question。
我在两个文件(File1 和 File2)中有两颗星的年龄。星星年龄一栏是 1 美元,其余 13 美元以下的栏是我需要在最后打印的信息。
我试图找到一个年龄,其中星星的年龄相同或最接近。由于文件太大(~25000 行),我不想在整个数组中搜索速度问题。 此外,它们的行数可能会有很大差异(在某些情况下可以说是 ~10000)
我不确定这是否是解决问题的最佳方法,但在缺乏更好的方法的情况下,这是我的想法。 (如果你有更快更高效的方法,请做)
所有值都具有 12 位小数的精度。现在我只关心第一列(年龄在哪里)。
而且我需要不同的循环。
让我们使用文件 1 中的这个值:
2.326062371284e+05
首先例程应该在 file2 中搜索所有包含的匹配项
2.3260e+05
(这个循环可能会在整个数组中搜索,但是如果有办法在搜索到 2.3261 时立即停止搜索,那么它会节省一些时间)
如果它只找到一个,那么输出应该是那个值。
通常会找到几行,甚至可能多达1000行。这样的话,它应该再次搜索
2.32606e+05
在之前建立的线之间。 (我认为这是一个嵌套循环) 然后匹配的数量将减少到 ~200
此时,例程应该搜索与之间具有一定容差X的最佳差
2.326062371284e+05
以及所有这 200 行。
这样就有这些文件
文件1
1.833800650355e+05 col2f1 col3f1 col4f1
1.959443501406e+05 col2f1 col3f1 col4f1
2.085086352458e+05 col2f1 col3f1 col4f1
2.210729203510e+05 col2f1 col3f1 col4f1
2.326062371284e+05 col2f1 col3f1 col4f1
2.441395539059e+05 col2f1 col3f1 col4f1
2.556728706833e+05 col2f1 col3f1 col4f1
文件2
2.210729203510e+05 col2f2 col3f2 col4f2
2.354895663228e+05 col2f2 col3f2 col4f2
2.499062122946e+05 col2f2 col3f2 col4f2
2.643228582664e+05 col2f2 col3f2 col4f2
2.787395042382e+05 col2f2 col3f2 col4f2
2.921130362004e+05 col2f2 col3f2 col4f2
3.054865681626e+05 col2f2 col3f2 col4f2
输出文件3(容差3000)
2.210729203510e+05 2.210729203510e+05 col2f1 col2f2 col4f1 col3f2
2.326062371284e+05 2.354895663228e+05 col2f1 col2f2 col4f1 col3f2
重要条件:
输出不应包含重复的行(星星 1 不能有固定年龄,星星 2 的年龄不同,只有最接近的。
你会怎么解决这个问题?
非常感谢!
ps:我已经完全改变了这个问题,因为它向我表明我的推理有一些错误。谢谢!
【问题讨论】:
-
这是最大公差吗? (即,如果我们发现一个差异在 X 之下的行,即使它不是最接近的,也要停在那里?)
-
我认为应该有一个公差,我不知道如何定义它。如果最佳最接近值之间的差异太大,它不应该找到答案。 (什么是大?10 年。时间列以年为单位)。
-
当你说
the nearest 100 rows (up and down)- 这意味着100行之前加上100之后,还是50之前加上50之后?如果当前行是从一开始的 10 行,这是否意味着之前的 10 行和之后的 50(或 100)行或之前的 10 行和之后的 90 行或其他什么?基本上,编辑您的问题以通过示例准确解释该陈述的含义。此外,为了便于我们进行测试,请编辑您的问题以将文件的大小减少到 10 行或更少,并在给定示例输入的情况下显示预期的输出,如果您的窗口是 4 行而不是 100 行。 -
如果您的输入中没有
NR列,请不要在示例中包含它。我们可以数数。前 2 行同上。使您的文件可测试 - 我们不想编辑您的文件并猜测我们需要删除哪些行和/或列来创建您的真实输入格式 - 只需发布您的真实输入和输出格式。 -
通常最好将新问题作为新问题提出。