From 911bfac1622729cb8457f84cb203c8cce2e7bda1 Mon Sep 17 00:00:00 2001 From: Jan Koll Date: Fri, 27 Jun 2025 17:31:38 +0200 Subject: [PATCH] Improve performance of occurrence counting Changed the algorithm for occurrence counting to improve performance. Previously it was based on expensive string manipulations and checks. The new approach is based on a frequency map with fewer iterations. --- .../de/jrpie/android/launcher/util/Algorithms.kt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/util/Algorithms.kt b/app/src/main/java/de/jrpie/android/launcher/util/Algorithms.kt index a75d08d..6e7151c 100644 --- a/app/src/main/java/de/jrpie/android/launcher/util/Algorithms.kt +++ b/app/src/main/java/de/jrpie/android/launcher/util/Algorithms.kt @@ -23,13 +23,17 @@ fun isSubsequent(text: String, search: String): Boolean { * as often as it occurs in `search`. */ fun countOccurrences(text: String, search: String): Int { - val foundCharacters = mutableListOf() - var mutText = text + val frequencies = mutableMapOf() + for (char in text) { + frequencies[char] = frequencies.getOrElse(char) { 0 } + 1 + } + var result = 0 for (char in search) { - if (mutText.contains(char)) { - foundCharacters.add(char) - mutText = mutText.replaceFirst(char.toString(), "") + val charFrequency = frequencies[char] ?: 0 + if (charFrequency > 0) { + result++ + frequencies[char] = charFrequency - 1 } } - return foundCharacters.size + return result }