Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取大文件的熵_C# - Fatal编程技术网

C# 获取大文件的熵

C# 获取大文件的熵,c#,C#,在浏览了所有与文件熵相关的帖子之后,出现了一个问题,即如何获得一个大文件的熵。我的意思是它能以多快的速度完成,以及解决这个问题的算法。是否有可能以某种方式使用LINQ?如果有,解决方案的速度有多快?感谢advance。这不是一个完整的答案。 完成的速度取决于文件中的位或字符数(每一位都有助于熵的度量)在时间上的比例。 你可以使用一些压缩算法来衡量文件的压缩程度,这样如果它没有压缩很多,那么内容就有很高的熵等等。我希望这有帮助 这不是一个完整的答案。 完成的速度取决于文件中的位或字符数(每一位都有

在浏览了所有与文件熵相关的帖子之后,出现了一个问题,即如何获得一个大文件的熵。我的意思是它能以多快的速度完成,以及解决这个问题的算法。是否有可能以某种方式使用LINQ?如果有,解决方案的速度有多快?感谢advance。这不是一个完整的答案。 完成的速度取决于文件中的位或字符数(每一位都有助于熵的度量)在时间上的比例。
你可以使用一些压缩算法来衡量文件的压缩程度,这样如果它没有压缩很多,那么内容就有很高的熵等等。我希望这有帮助

这不是一个完整的答案。 完成的速度取决于文件中的位或字符数(每一位都有助于熵的度量)在时间上的比例。
你可以使用一些压缩算法来衡量文件的压缩程度,这样如果它没有压缩很多,那么内容就有很高的熵等等。我希望这有帮助

它看起来像这样

static double CalculateEntropy(FileInfo file)
{
    int range = byte.MaxValue + 1; // 0 -> 256
    byte[] values = File.ReadAllBytes(file.FullName);

    long[] counts = new long[range];
    foreach (byte value in values)
    {
        counts[value]++;
    }

    double entropy = 0;
    foreach (long count in counts)
    {
        if (count != 0)
        {
            double probability = (double)count / values.LongLength;
            entropy -= probability * Math.Log(probability, range);
        }
    }
    return entropy;
}

通过交换
文件.ReadAllText()
并用
char
替换
byte
,可以计算字符熵而不是字节熵。我怀疑你会发现一个使用Linq的更快的解决方案,但是尝试一下会成为一个很好的谜题。

它看起来像这样

static double CalculateEntropy(FileInfo file)
{
    int range = byte.MaxValue + 1; // 0 -> 256
    byte[] values = File.ReadAllBytes(file.FullName);

    long[] counts = new long[range];
    foreach (byte value in values)
    {
        counts[value]++;
    }

    double entropy = 0;
    foreach (long count in counts)
    {
        if (count != 0)
        {
            double probability = (double)count / values.LongLength;
            entropy -= probability * Math.Log(probability, range);
        }
    }
    return entropy;
}

通过交换
文件.ReadAllText()
并用
char
替换
byte
,可以计算字符熵而不是字节熵。我怀疑您是否能找到使用Linq的更快的解决方案,但尝试一下将是一个很好的谜题。

根据本页其他地方的要求,这里有一个
不安全的
版本。我的以下版本还包含以下更改:

  • 将对数修正为基2(而不是
    256
    ),以便与描述系统状态所需的最小位数一致。实际上,调用
    熵(新字节[]{0,1,2,…255})
    现在给出了预期的答案8.0
    熵(新字节[]{88,79,79,88})
    返回1.0
    熵(新字节[]{4,15,20,166})
    返回2.0,等等
  • 通过从循环中提取分母来减少下溢,从而提高浮点精度
  • 循环提取还需要退化的
    熵(新字节[0])
    ——即,无的熵现在返回
    NaN
    (而不是
    0.000
    )。而这项法令,d̲o̲e̲s̲有效地将单个可疑案例与信息量更大的0.000结果区分开来,例如
    熵(新字节[]{123})
    熵(新字节[]{0xff,0xff,0xff})
    ,等等
  • 特定的文件读取行为已被删除,因此下面的函数适用于任何类型的数据
  • 承认香农的开创性贡献,将变量名更改为“
    H


根据本页其他地方的要求,这里是的
unsafe
版本。我的以下版本还包含以下更改:

  • 将对数修正为基2(而不是
    256
    ),以便与描述系统状态所需的最小位数一致。实际上,调用
    熵(新字节[]{0,1,2,…255})
    现在给出了预期的答案8.0
    熵(新字节[]{88,79,79,88})
    返回1.0
    熵(新字节[]{4,15,20,166})
    返回2.0,等等
  • 通过从循环中提取分母来减少下溢,从而提高浮点精度
  • 循环提取还需要退化的
    熵(新字节[0])
    ——即,无的熵现在返回
    NaN
    (而不是
    0.000
    )。而这项法令,d̲o̲e̲s̲有效地将单个可疑案例与信息量更大的0.000结果区分开来,例如
    熵(新字节[]{123})
    熵(新字节[]{0xff,0xff,0xff})
    ,等等
  • 特定的文件读取行为已被删除,因此下面的函数适用于任何类型的数据
  • 承认香农的开创性贡献,将变量名更改为“
    H


你用什么量度熵?你将使用什么概率函数?请更具体一点,你用的是什么熵的度量?你将使用什么概率函数?请更具体一点,好吧,假设在这种情况下使用LINQ不是最好的主意。那么不安全代码呢?在
unsafe
块中使用指针算法的实现可能会更快。除非确认安全代码对于您的目的来说太慢,否则这样做是不值得的。好吧,假设在这种情况下使用LINQ不是最好的主意。那么不安全代码呢?在
unsafe
块中使用指针算法的实现可能会更快。除非确认安全代码对于您的目的来说太慢,否则这样做是不值得的。