diff --git a/.jules/bolt.md b/.jules/bolt.md index 8f342ab..fd52a5d 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -3,3 +3,6 @@ ## 2024-05-24 - O(N) Iteration in Cache Size Calculation **Learning:** Calculating dynamic capacity dynamically via `store.values.sumOf { it.sizeBytes }` effectively incurs an O(N) cost on every `put` because it runs when `trimToCapacity()` calls `dynamicCapacity`. When cache sizes get large, this causes O(N²) overall insertion performance and UI stutters. **Action:** Use an `AtomicLong` (O(1)) to track the running sum of cache size instead of dynamically iterating through the entire collection. +## 2024-10-06 - O(N^2) Lookup Optimization in List +**Learning:** Using `List.none { it.id == post.id }` within a loop creates an O(N^2) complexity because `none` iterates over the list which grows linearly. +**Action:** Replace `List.none` or `List.contains` checks on growing collections with an O(1) `Set.add` tracking mechanism when maintaining uniqueness. diff --git a/app/src/main/java/com/example/reddittube/data/DataRepository.kt b/app/src/main/java/com/example/reddittube/data/DataRepository.kt index 90c2f6a..9015827 100644 --- a/app/src/main/java/com/example/reddittube/data/DataRepository.kt +++ b/app/src/main/java/com/example/reddittube/data/DataRepository.kt @@ -259,6 +259,7 @@ class DefaultDataRepository(private val context: Context) : DataRepository { val token = RedditOAuthHelper.getOrFetchAccessToken(context) if (token == null) { emit(SearchVideosResult(emptyList(), null)); return@flow } val results = mutableListOf() + val seenIds = mutableSetOf() var currentAfter = after var finalAfter: String? = null try { @@ -276,7 +277,8 @@ class DefaultDataRepository(private val context: Context) : DataRepository { for (i in 0 until children.length()) { val childData = children.getJSONObject(i).optJSONObject("data") ?: continue parseRedditPost(childData)?.let { post -> - if (results.none { it.id == post.id }) { + // Performance optimization: Avoid O(N^2) list search by using a Set for seen IDs + if (seenIds.add(post.id)) { results.add(post) } } diff --git a/app/src/main/java/com/example/reddittube/ui/main/components/MinimalButton.kt b/app/src/main/java/com/example/reddittube/ui/main/components/MinimalButton.kt index 056265a..8879150 100644 --- a/app/src/main/java/com/example/reddittube/ui/main/components/MinimalButton.kt +++ b/app/src/main/java/com/example/reddittube/ui/main/components/MinimalButton.kt @@ -16,7 +16,6 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.semantics.Role import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp