我的一位朋友说,位掩码比位集更好,因为复制位集需要O(N)时间,而复制位掩码只需要O(1)时间,这使得动态编程等应用程序的速度更快。所以我想知道所有其他数据类型是否相同?
例如,这段代码的复杂程度是什么?
int x = 530210;
int y = x;
如果是O(N),为什么会这样呢?不应该是O(1)就像做
这样的事情<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="guidi.moodandroid">
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".SmsBroadcastReceiver" android:exported="true" >
<intent-filter android:priority="999" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
</manifest>
会是吗?
答案 0 :(得分:6)
这辆卡车代表vec1
std::vector<T>
,其拖车上附有黑色容器。
(来源:bigcommerce.com)
现在,黑色容器( black-container ,std::vector<T>
的内存中有数百万篇论文用于元素。现在,您想将纸张复印到另一个类似的车辆vec2
。你怎么做得最好?什么是照片 - 复制复杂性?它将是 O(论文数量)
现在,假设你想要移动内容...所有std::vector
需要做的就是从卡车上拆下黑色容器,将它附加到另一辆卡车上...这使移动容器的复杂性成为 O(1)
答案 1 :(得分:1)
要了解操作的复杂性,首先必须定义计算模型。特别是,您必须定义哪些操作是O(1)以及您认为哪些操作是免费的。
例如,如果您正在查看需要大量硬盘访问的程序,您只考虑从磁盘读取一个块作为一个操作和内存访问是免费的。
在位掩码和位集的示例中,您可能正在计算内存块复制操作。然后复制适合一个内存块的位掩码只需要一个内存副本。但是,在此模型中复制位掩码仍然是O(N),因为大的位掩码将跨越许多内存块。更确切地说,如果b是一个存储器块中的位数和N是位掩码中的位数,那么您需要ceil(N / b)存储器块复制操作来复制位掩码。
答案 2 :(得分:1)
复制长度为N
的向量可以通过多种方式进行衡量:
O(1)
矢量复制操作O(N)
元素复制操作O(NT)
度量单位,如果元素复制操作为O(T)
顺便说一下,你的朋友错误bitset
,或者你误解了。 bitset
的优点是数据结构经过优化,可以利用可由单个线程完成的低级并行执行 - 即64位整数运算可用于处理64个不同的位同时进行。