C# 获取大文件的熵
在浏览了所有与文件熵相关的帖子之后,出现了一个问题,即如何获得一个大文件的熵。我的意思是它能以多快的速度完成,以及解决这个问题的算法。是否有可能以某种方式使用LINQ?如果有,解决方案的速度有多快?感谢advance。这不是一个完整的答案。 完成的速度取决于文件中的位或字符数(每一位都有助于熵的度量)在时间上的比例。C# 获取大文件的熵,c#,C#,在浏览了所有与文件熵相关的帖子之后,出现了一个问题,即如何获得一个大文件的熵。我的意思是它能以多快的速度完成,以及解决这个问题的算法。是否有可能以某种方式使用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
块中使用指针算法的实现可能会更快。除非确认安全代码对于您的目的来说太慢,否则这样做是不值得的。