For-Loop的大O表示法

时间:2017-02-16 21:48:01

标签: algorithm for-loop big-o notation

如何找到此for循环代码行的Big O表示法

int imageWidth = tiff.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); int imageHeight = tiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); int bytesPerSample = (int)tiff.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt() / 8; SampleFormat format = (SampleFormat)tiff.GetField(TiffTag.SAMPLEFORMAT)[0].ToInt(); //Array to return float[,] decoded = new float[imageHeight, imageWidth]; //Get decode function (I only want a float array) Func<byte[], int, float> decode = GetConversionFunction(format, bytesPerSample); if (decode == null) { throw new ArgumentException("Unsupported TIFF format:"+format); } if(tiff.IsTiled()) { //tile dimensions in pixels - the image dimensions MAY NOT be a multiple of these dimensions int tileWidth = tiff.GetField(TiffTag.TILEWIDTH)[0].ToInt(); int tileHeight = tiff.GetField(TiffTag.TILELENGTH)[0].ToInt(); //tile matrix size int numTiles = tiff.NumberOfTiles(); int tileMatrixWidth = (int)Math.Ceiling(imageWidth / (float)tileWidth); int tileMatrixHeight = (int)Math.Ceiling(imageHeight / (float)tileHeight); //tile dimensions in bytes int tileBytesWidth = tileWidth * bytesPerSample; int tileBytesHeight = tileHeight * bytesPerSample; //tile buffer int tileBufferSize = tiff.TileSize(); byte[] tileBuffer = new byte[tileBufferSize]; int imageHeightMinus1 = imageHeight - 1; for (int tileIndex = 0 ; tileIndex < numTiles; tileIndex++) { int tileX = tileIndex / tileMatrixWidth; int tileY = tileIndex % tileMatrixHeight; tiff.ReadTile(tileBuffer, 0, tileX*tileWidth, tileY*tileHeight, 0, 0); int xImageOffset = tileX * tileWidth; int yImageOffset = tileY * tileHeight; for (int col = 0; col < tileWidth && xImageOffset+col < imageWidth; col++ ) { for(int row = 0; row < tileHeight && yImageOffset+row < imageHeight; row++) { decoded[imageHeightMinus1-(yImageOffset+row), xImageOffset+col] = decode(tileBuffer, row * tileBytesWidth + col * bytesPerSample); } } } }

有人知道吗?

我已经阅读了一些关于Big O Notation的内容,这是一个非常令人困惑的主题。我知道通常像这样的for循环→for (int j = 0; pow(j,2) < n; j++) ?,有一个大O符号 O(1),因为输入增加13,所以它的输出也是线性复杂度。这与上述情况相同吗?

1 个答案:

答案 0 :(得分:4)

像这样的循环:

for (int i = 0; i < n; ++i) {
    doSomething(i);
}

迭代 n 次,因此如果doSomething具有O(1)运行时间,则整个循环具有O( n )运行时间。

同样,这样的循环:

for (int j = 0; pow(j, 2) < n; j++) {
    doSomething(j);
}

迭代⌈√ n ⌉次,所以如果doSomething有O(1)运行时间,那么整个循环就有O(√ n )运行时间。

顺便说一句,请注意虽然pow(j, 2)是O(1)运行时间 - 所以它不会影响你的循环的渐近复杂性 - 但它仍然很慢,因为它涉及对数和取幂。在大多数情况下,我建议改为:

for (int j = 0; j * j < n; j++) {
    doSomething(j);
}

或者也许这样:

for (int j = 0; 1.0 * j * j < n; j++) {
    doSomething(j);
}