如何找到此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,所以它的输出也是线性复杂度。这与上述情况相同吗?
答案 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);
}