首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Uint8List中的序列搜索

Uint8List中的序列搜索
EN

Stack Overflow用户
提问于 2020-12-08 07:45:34
回答 2查看 193关注 0票数 0

是否有快速(本机)方法来搜索Uint8List中的序列

代码语言:javascript
复制
///
/// Return index of first occurrence of seq in list
///
int indexOfSeq(Uint8List list, Uint8List seq) {
  ...
}

编辑:将List<int>更改为Uint8List

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-08 09:27:03

不是的。没有内置的方式来搜索列表中的元素序列。我也不知道任何基于dart:ffi的实现。

最简单的办法是:

代码语言:javascript
复制
extension IndexOfElements<T> on List<T> {
  int indexOfElements(List<T> elements, [int start = 0]) {
    if (elements.isEmpty) return start;
    var end = length - elements.length;
    if (start > end) return -1;
    var first = elements.first;
    var pos = start;
    while (true) {
      pos = indexOf(first, pos);
      if (pos < 0 || pos > end) return -1;
      for (var i = 1; i < elements.length; i++) {
        if (this[pos + i] != elements[i]) {
          pos++;
          continue;
        }
      }
      return pos;
    }
  }
}

这具有最坏的时间复杂度O(length*elements.length)。有更多的算法具有更好的最坏情况复杂度,但它们也有更大的常数因子和更昂贵的预计算(KMPBMH)。除非您多次搜索相同的长列表,或者在一个非常非常长的列表中搜索,否则它们在实践中不太可能更快(而且它们可能有一个API,您可以先编译模式,然后使用它进行搜索)。

票数 3
EN

Stack Overflow用户

发布于 2020-12-10 10:34:16

您可以按照您的建议使用dart:ffistring.h绑定到memmem

我们对mallocstdlib.h in package:ffi (来源)的绑定也是如此。

代码语言:javascript
复制
final DynamicLibrary stdlib = Platform.isWindows
    ? DynamicLibrary.open('kernel32.dll')
    : DynamicLibrary.process();

final PosixMalloc posixMalloc =
    stdlib.lookupFunction<Pointer Function(IntPtr), Pointer Function(int)>('malloc');

编辑:正如lrn所指出的,目前我们不能公开Uint8List的内部数据指针,因为GC可能会重新定位它。

可以使用dart_api.h并使用FFI将TypedData通过FFI蹦床作为Dart_Handle,并使用来自dart_api.hDart_TypedDataAcquireData访问内部数据指针。

(如果你想在颤振中使用这一点,我们需要在Dart_TypedDataAcquireDataDart_TypedDataReleaseData中公开dart_api_dl.h https://github.com/dart-lang/sdk/issues/40607 --我已经提交了https://github.com/dart-lang/sdk/issues/44442来跟踪这一点。)

或者,可以寻址https://github.com/dart-lang/sdk/issues/36707,这样我们就可以直接在FFI蹦床中公开Uint8List的内部数据指针。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65194980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档