Google Protobuf反序列化重复对象get操作的时间复杂度

Posted

技术标签:

【中文标题】Google Protobuf反序列化重复对象get操作的时间复杂度【英文标题】:Time Complexity of get operation on Google Protobuf deserialized repeated object 【发布时间】:2017-01-31 20:26:01 【问题描述】:

假设我们创建了一个包含重复某些数据类型的原型文件,例如

message DocList 
    repeated string docId = 1;

现在我们通过以下方式将对象插入到它的构建器对象中:

DocList.Builder docList = new DocList.newBuilder()
docList.addAllDocId(docIDlist);         // docIDList is ArrayList<String>

现在我们执行以下 get 操作来检索索引处的对象。

docList.getDocId(i);   // Some index i

我想知道这个get操作是O(1)还是O(n)?

【问题讨论】:

【参考方案1】:

Protobuf ListValuejava.util.ArrayList 支持

if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) 
      values_ = new java.util.ArrayList<com.google.protobuf.Value>();
      mutable_bitField0_ |= 0x00000001;

因此 get()

是 O(1)

OpenJDK ArrayList

@SuppressWarnings("unchecked")
E elementData(int index) 
    return (E) elementData[index];

【讨论】:

以上是关于Google Protobuf反序列化重复对象get操作的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

Google protobuf序列化以及反序列化

通讯协议及Google.Protobuf生成c#代码 序列及反序列化

java对象的序列化和反序列化

Protobuf 反序列化异常

基于protobuf2.6序列化 反序列化

Google 的Protobuf 的使用方式(序列化和反序列化工具-编解码)