From 6034b703de6b5d99e795d85d949d8c2981f23223 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sun, 19 Jul 2026 19:20:53 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20R=20=EC=96=B8=EC=96=B4=20?= =?UTF-8?q?=EC=B5=9C=EC=86=9F=EA=B0=92=20=ED=83=90=EC=83=89=20=EC=B5=9C?= =?UTF-8?q?=EC=A0=81=ED=99=94=20(sort=20=EB=8C=80=EC=8B=A0=20which.min=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit πŸ’‘ What: `surveyFA.R`μ—μ„œ p-value의 μ΅œμ†Ÿκ°’μ„ 찾을 λ•Œ μ‚¬μš©λ˜λ˜ `sort()` 기반 탐색을 `which.min()`으둜 λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€. 🎯 Why: 전체 데이터λ₯Ό μ •λ ¬ν•˜λŠ” `sort()`λŠ” O(N log N)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ§€λ©° 큰 λ°μ΄ν„°μ—μ„œ λΆˆν•„μš”ν•œ 병λͺ©μ„ μœ λ°œν•©λ‹ˆλ‹€. 이λ₯Ό `which.min()`으둜 λŒ€μ²΄ν•˜μ—¬ O(N) μ„ ν˜• νƒμƒ‰μœΌλ‘œ μ΅œμ ν™”ν–ˆμŠ΅λ‹ˆλ‹€. πŸ“Š Impact: λ°μ΄ν„°μ˜ μ΅œμ†Ÿκ°’ 탐색에 ν•„μš”ν•œ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ 볡사와 μ •λ ¬ μ˜€λ²„ν—€λ“œκ°€ μ œκ±°λ˜μ–΄ λΉ λ₯Έ 싀행이 κ°€λŠ₯ν•©λ‹ˆλ‹€. πŸ”¬ Measurement: κΈ°μ‘΄ ν…ŒμŠ€νŠΈ μ½”λ“œλ“€μ΄ λͺ¨λ‘ ν†΅κ³Όλ˜λŠ” 것을 ν™•μΈν•©λ‹ˆλ‹€. --- .jules/bolt.md | 3 +++ R/surveyFA.R | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.jules/bolt.md b/.jules/bolt.md index 7d3c603..aa9dd8a 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -16,3 +16,6 @@ ## 2025-02-12 - R μ–Έμ–΄μ—μ„œ 반볡적인 mirt λͺ¨λΈ 생성 μ‹œ λΆˆν•„μš”ν•œ λ°μ΄ν„°ν”„λ ˆμž„ λΆ€λΆ„μ§‘ν•© μΆ”μΆœ μ΅œμ ν™” **Learning:** Rμ—μ„œ λ°μ΄ν„°ν”„λ ˆμž„μ˜ νŠΉμ • 열을 μΆ”μΆœν•˜λŠ” μž‘μ—…(`df[cols]`)은 O(N)의 λ©”λͺ¨λ¦¬ 볡사λ₯Ό μˆ˜λ°˜ν•©λ‹ˆλ‹€. `autoFIPC`μ—μ„œ `mirt` λͺ¨λΈμ˜ νŒŒλΌλ―Έν„°λ₯Ό μ„€μ •ν•˜κ±°λ‚˜ ν˜ΈμΆœν•˜λŠ” κ³Όμ • 쀑에 `newformXDataK[colnames(newFormModel@Data$data)]` μ½”λ“œκ°€ λ°˜λ³΅ν•΄μ„œ μ‚¬μš©λ˜μ—ˆκ³ , 심지어 `ncol()`을 μœ„ν•΄ λ‹¨μˆœνžˆ 개수λ₯Ό ꡬ할 λ•Œλ„ μ‚¬μš©λ˜μ–΄ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ ν• λ‹Ήκ³Ό μ˜€λ²„ν—€λ“œλ₯Ό μ΄ˆλž˜ν–ˆμŠ΅λ‹ˆλ‹€. **Action:** μ‘°κ±΄λ¬Έμ΄λ‚˜ 반볡문 λ‚΄λΆ€μ—μ„œ λΆˆν•„μš”ν•˜κ²Œ λ°μ΄ν„°ν”„λ ˆμž„ λΆ€λΆ„μ§‘ν•© 연산이 λ°˜λ³΅λ˜μ§€ μ•Šλ„λ‘ μ™ΈλΆ€μ—μ„œ ν•œ 번만 `linkedFormData <- newformXDataK[colnames(newFormModel@Data$data)]`둜 캐싱(caching)ν•œ λ’€, `ncol(linkedFormData)`와 `data = linkedFormData` ν˜•νƒœλ‘œ μž¬μ‚¬μš©ν•˜μ—¬ λ©”λͺ¨λ¦¬ 볡사와 O(N) μ˜€λ²„ν—€λ“œλ₯Ό λ°©μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€. +## 2025-02-12 - R μ–Έμ–΄μ—μ„œ μ΅œμ†Ÿκ°’ 탐색 μ‹œ λΆˆν•„μš”ν•œ μ •λ ¬ μ˜€λ²„ν—€λ“œ 제거 +**Learning:** Rμ—μ„œ λ²‘ν„°μ˜ μ΅œμ†Ÿκ°’μ„ 찾을 λ•Œ `sort(x)[1]` λ˜λŠ” `names(sort(x))[1]`을 μ‚¬μš©ν•˜λ©΄ λΆˆν•„μš”ν•˜κ²Œ 전체 벑터λ₯Ό μ •λ ¬ν•˜λ―€λ‘œ O(N log N)의 μ‹œκ°„ λ³΅μž‘λ„κ°€ λ°œμƒν•©λ‹ˆλ‹€. +**Action:** `which.min(x)`λ₯Ό μ‚¬μš©ν•˜μ—¬ O(N) μ„ ν˜• νƒμƒ‰μœΌλ‘œ μ΅œμ†Ÿκ°’μ˜ 인덱슀λ₯Ό 직접 μ°Ύμ•„ `names(x)[which.min(x)]` ν˜•νƒœλ‘œ μ ‘κ·Όν•¨μœΌλ‘œμ¨ μ˜€λ²„ν—€λ“œλ₯Ό μ΅œμ ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€. diff --git a/R/surveyFA.R b/R/surveyFA.R index f60fffd..2f2c23c 100644 --- a/R/surveyFA.R +++ b/R/surveyFA.R @@ -232,7 +232,8 @@ surveyFA <- function( names(p_values) <- rownames(fit_df) if (any(!is.na(p_values))) { p_values[is.na(p_values)] <- 1 - candidate <- names(sort(p_values, decreasing = FALSE))[1L] + # ⚑ Bolt: Use which.min() for O(N) linear scan instead of O(N log N) sort() + candidate <- names(p_values)[which.min(p_values)] if (!is.na(candidate) && p_values[[candidate]] < pThreshold) { return(candidate) }