簡體   English   中英

Kotlin 中檢查兩個 arrays 中的值是否相差不大的最有效方法是什么?

[英]What is the most efficient way in Kotlin to check if values in two arrays don't differ by much?

我需要檢查兩個 IntArray 對象中的值是否相差不超過 1。

這是工作代碼,它花費的時間太長:

         var pixelOutsideOfTolerance = false
         val PIXEL_VALUE_TOLERANCE = 1
            for (i in 0 until pixels1.lastIndex) {
                if (pixels1[i] - pixels2[i] > PIXEL_VALUE_TOLERANCE && pixels1[i] - pixels2[i] < - PIXEL_VALUE_TOLERANCE) {
                    pixelOutsideOfTolerance = true
                }
            }
         // Do something with pixelOutsideOfTolerance

執行此操作的性能更高且更有說服力的方法是什么?

在修復性能之前,您必須確保正確性:

  • 您有一個差一錯誤,因為lastIndex是實際的最后一個索引,而不是大小。 使用for (i in pixels1.indices)而不是明確的范圍來避免這種錯誤
  • 您的情況永遠不會成立,因為您使用的是&&而不是|| . 使用abs(pixels1[i] - pixels2[i]) > PIXEL_VALUE_TOLERANCE而不是更復雜的條件檢查正面和負面,它會更容易閱讀並且不太可能出錯(你需要import kotlin.math.abs )

現在,即使您已經知道某些像素差異超出了容差范圍,您仍然在執行整個循環。 為這個循環提取一個function,當滿足“outside tolerance”條件時提前返回。

應用以上內容,您現在應該擁有:

import kotlin.math.abs

private const val PIXEL_VALUE_TOLERANCE = 1

private fun areSimilar(pixels1: IntArray, pixels2: IntArray): Boolean {
    for (i in pixels1.indices) {
        if (abs(pixels1[i] - pixels2[i]) > PIXEL_VALUE_TOLERANCE) {
            return false
        }
    }
    return true
}

// then just use
val pixelsOutsideOfTolerance = !areSimilar(pixels1, pixels2)

如果性能不是必需的,您還可以在此處使用更實用的方法。 例如:

val pixelsOutsideOfTolerance = pixels1.indices.any {
    abs(pixels1[it] - pixels2[it]) > PIXEL_VALUE_TOLERANCE
}

要么:

val pixelsOutsideOfTolerance = pixels1.asSequence().zip(pixels2.asSequence())
    .any { abs(it.first - it.second) > PIXEL_VALUE_TOLERANCE }

但如果它真的是你試圖加速的熱門路徑,那會因為裝箱而適得其反。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM