【问题标题】:Where do I find the complexity of an operation?我在哪里可以找到操作的复杂性?
【发布时间】:2017-12-15 10:55:20
【问题描述】:

this answer 中提到,对于一个字符串 s.chars().count() 获取字符数是 O(n) 操作。 对于简单的 ASCII 字符串,使用 s.len() 获取字节数也可以。当使用检查来确保所有这些字节实际上都是 ASCII 时,这可能是安全的。

我想知道该操作的复杂性是什么。它可能仍然需要像在 C 中那样找到字符串的结尾并且是 O(n)。

我试着查了一下,发现documentation of the std::string::String, 这适用于适当的s。但是它没有说明它的复杂性。查看源代码它只是这样做self.vec.len()。所以我们去查看vector docs,发现它只是返回了一个存储长度self.len,这意味着这确实是一个O(1)操作。

不过,这是很多工作。那么sstd::str 的情况呢?我尝试做同样的事情,但卡在this mess

对于 Rust 中的操作复杂性,是否有更易于访问的资源?

list for Python 这样的东西会很棒。

【问题讨论】:

  • 请注意,检查所有字符都是 ascii 是 O(n),就像 s.chars().count(),所以除非你需要检查其他原因,你最好使用 s.chars().count()
  • 应记录所有数据类型的复杂性。如果它们丢失,请随时发送 PR 或提出问题。我不认为一个包含所有复杂性的集中列表是合适的地方。这仅对集合有意义,您需要概览来决定使用哪个集合。

标签: rust


【解决方案1】:

除了performance section on collections,我认为目前没有像您引用的 Python 那样的通用列表。

对于str,确定它的长度是一个O(1)操作,因为a string slice consists of a pointer and length

// We can re-build a str out of ptr and len. This is all unsafe because
// we are responsible for making sure the two components are valid:
let s = unsafe {
    // First, we build a &[u8]...
    let slice = slice::from_raw_parts(ptr, len);

    // ... and then convert that slice into a string slice
    str::from_utf8(slice)
};

【讨论】:

  • 准确地说,str::len 决定了代码单元的长度(就像String::len)。要获取代码点的长度,您需要调用 str::chars::count,即 O(1)(与 String 相同)。
  • @Jmb 我知道你的意思是 O(n),但我想我会提到它以防其他人出现并感到困惑:)
【解决方案2】:

Stringstr 为所有操作提供相同的复杂性保证。事实上,String(包括chars()are actually operations on str 上的大多数操作都使用从Stringstr 的隐式转换(这种转换是免费的,因为它们共享相同的低级表示)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2012-05-30
    相关资源
    最近更新 更多