在C ++中复制变量的复杂性是什么?

时间:2017-01-07 10:27:00

标签: c++ time-complexity

我的一位朋友说,位掩码比位集更好,因为复制位集需要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>

会是吗?

3 个答案:

答案 0 :(得分:6)

这辆卡车代表vec1 std::vector<T>,其拖车上附有黑色容器

enter image description here

(来源: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个不同的位同时进行。