【发布时间】:2021-12-01 05:17:04
【问题描述】:
我有一个包含键/值对排序列表的文件。键是固定长度的字符串,值是整数的二进制表示。因此,如果密钥大小为 6,则每条记录正好是 10 个字节(6+sizeof(int))。密钥大小可以是任何(合理的)值,但对于文件中的每条记录都是相同的。
例如,数据文件可能如下所示(其中 'xxxx' 是 int 值的二进制表示):
ABLE xxxxBAKER xxxxCARL xxxxDELTA xxxxEDGAR xxxxGEORGExxxx
我想将此表加载到内存中(一个字节[])并对其进行二进制搜索。在 C++ 中,这很简单,bsearch() 函数接受一个“元素大小”参数,告诉它缓冲区中记录的大小,但我在 C# 中找不到类似的函数。
我也看过 Array.BinarySearch,但我不知道我会用什么作为 T。
【问题讨论】:
-
如果要将它们组织成
byte[]的数组(即字节数组的数组),那么Array.BinarySearch<T>()中的T参数就是byte[] -
我假设您的意思是“二进制搜索”是指寻找未排序的二进制数据,而不是 en.wikipedia.org/wiki/Binary_search_algorithm
-
如果是前者,那么您可以使用 Boyer-Moore 的实现,例如我在此处发布的示例:stackoverflow.com/a/37500883/106159
-
@MatthewWatson,不,它已排序。我添加了一个文件外观示例。
-
在 C# 中这不是一个简单的方法,因为这些字节的布局方式与托管类型的布局方式不对应。可以(比如说)声明一个
struct,它或多或少准确地覆盖它并使用Spans 来访问它,但这充其量会减少内存使用,并且仍然会产生解码字符串和比较它们的开销,所以它通常不会胜过简单地解析文件——“二进制”并没有给它任何特殊的地位。
标签: c#