从文件C中仅读取奇数/偶数行

时间:2016-03-03 19:51:36

标签: c file random

任务是从txt文件中读取一些随机行(奇数或偶数,我将指定它),并且用户只写绝对相同的,如果它是正确的(相同的)程序< ll ll print成功。问题是我不知道如何只读取奇数或偶数行#并且它也应该随机生成(如奇数或偶数)。感谢

1 个答案:

答案 0 :(得分:1)

循环和忽略偶数项的常用方法是......

for( int i = 0; thing = get_thing(); i++ ) {
    /* It's even, skip it */
    if( abs(i % 2) == 0 )
        continue;

    ...do stuff with thing...
}

abs(i % 2) == 0检查偶数,abs(i % 2) == 1检查奇数。如果您想选择其中一个,请使用int parityabs(i % 2) == parity

从文件中有效地选择随机行需要少量数学。您必须阅读该文件一次,因为无法知道行的开始和结束位置。

效率低下的算法会读取所有N行然后选择一行,可能消耗大量内存。更高效的算法只会存储每行开始的位置。两者都是O(n)内存(意味着内存使用量随着文件大小的增长而增长)。但是有一个O(1)内存算法,只需要存储一行。

每一行都有1 / N的机会被选中。高效算法在读入时将其应用于每一行,但 N是到目前为止读取的行数。在伪代码......

int num_lines = 0;
char *picked_line = NULL;
while( line = getline() ) {
    num_lines++;

    if( roll(num_lines) == num_lines ) {
        picked_line = line;
    }
}

因此第一行有1/1的机会被选中。第二行有1/2的机会被选中。第三个有1/3的机会,依此类推。

为什么这会增加每一行有1 / N的机会?好吧,让我们来看看从三个中选出的第一行。

  1. 第一行有1/1的机会。
    • 被挑选。第1行的总赔率现在为1。
  2. 第二行有1/2的机会。
    • 第一行,被挑选的一行,有1/2的幸存机会。
    • 第一行被选中的几率现在是1 * 1/2或1/2。
  3. 第3行有1/3的机会。
    • 第一行,被挑选的一行,有2/3的幸存机会。
    • 第一行被选中的几率现在是1 * 1/2 * 2/3或2/6或1/3。
  4. 你可以对第二行和第三行做同样的事情来向自己证明这是有效的。