From 3069ee579659af76f4d9ac5174ee98a2b20db1be Mon Sep 17 00:00:00 2001 From: Micke <155267459+reallesee@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:30:56 +0200 Subject: [PATCH 1/4] Optimize is_subsequence function to linear time complexity --- vm/src/utils.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/vm/src/utils.rs b/vm/src/utils.rs index 6a6a284ee6..f9d7d77216 100644 --- a/vm/src/utils.rs +++ b/vm/src/utils.rs @@ -28,14 +28,20 @@ macro_rules! any_box { } pub fn is_subsequence(subsequence: &[T], mut sequence: &[T]) -> bool { - for search in subsequence { - if let Some(index) = sequence.iter().position(|element| search == element) { - sequence = &sequence[index + 1..]; - } else { - return false; + if subsequence.is_empty() { + return true; + } + + let mut subseq_idx = 0; + for element in sequence { + if element == &subsequence[subseq_idx] { + subseq_idx += 1; + if subseq_idx == subsequence.len() { + return true; + } } } - true + false } pub fn from_relocatable_to_indexes(relocatable: Relocatable) -> (usize, usize) { From de91b5b155daa163b89aa6f261fe3ea9edbc8cf2 Mon Sep 17 00:00:00 2001 From: Micke <155267459+reallesee@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:35:53 +0200 Subject: [PATCH 2/4] fix: make is_subsequence panic-safe by using pattern matching --- vm/src/utils.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/vm/src/utils.rs b/vm/src/utils.rs index f9d7d77216..6be26cd7b4 100644 --- a/vm/src/utils.rs +++ b/vm/src/utils.rs @@ -28,17 +28,16 @@ macro_rules! any_box { } pub fn is_subsequence(subsequence: &[T], mut sequence: &[T]) -> bool { - if subsequence.is_empty() { - return true; - } - let mut subseq_idx = 0; for element in sequence { - if element == &subsequence[subseq_idx] { - subseq_idx += 1; - if subseq_idx == subsequence.len() { - return true; + match subsequence.get(&subseq_idx) { + Some(sub_elem) if element == &sub_elem => { + subseq_idx += 1; + if subseq_idx == subsequence.len() { + return true; + } } + None => return false } } false From 9c26dc2245aa59217112572b8ccec5b8edb46998 Mon Sep 17 00:00:00 2001 From: Micke <155267459+reallesee@users.noreply.github.com> Date: Fri, 18 Jul 2025 18:06:05 +0200 Subject: [PATCH 3/4] Update utils.rs --- vm/src/utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vm/src/utils.rs b/vm/src/utils.rs index 6be26cd7b4..2184ef3acc 100644 --- a/vm/src/utils.rs +++ b/vm/src/utils.rs @@ -37,7 +37,7 @@ pub fn is_subsequence(subsequence: &[T], mut sequence: &[T]) -> bo return true; } } - None => return false + None => return true } } false From c0cce9b60cfc0b4fac54352908c7191699330a2f Mon Sep 17 00:00:00 2001 From: Micke <155267459+reallesee@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:16:26 +0200 Subject: [PATCH 4/4] fix: restore empty check and fix None case handling in is_subsequence function --- vm/src/utils.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/vm/src/utils.rs b/vm/src/utils.rs index 2184ef3acc..24d0120572 100644 --- a/vm/src/utils.rs +++ b/vm/src/utils.rs @@ -28,6 +28,10 @@ macro_rules! any_box { } pub fn is_subsequence(subsequence: &[T], mut sequence: &[T]) -> bool { + if subsequence.is_empty() { + return true; + } + let mut subseq_idx = 0; for element in sequence { match subsequence.get(&subseq_idx) { @@ -37,7 +41,7 @@ pub fn is_subsequence(subsequence: &[T], mut sequence: &[T]) -> bo return true; } } - None => return true + None => return false } } false