From 7a8d2c7d27b561f7245c9fbd46ea9d8841e85ae2 Mon Sep 17 00:00:00 2001 From: Federico Fiaschi Date: Tue, 30 Jul 2024 11:13:52 +0200 Subject: [PATCH 1/7] feat: add fibonaccisearch algorithm --- search/fibonacci_search.ts | 56 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 search/fibonacci_search.ts diff --git a/search/fibonacci_search.ts b/search/fibonacci_search.ts new file mode 100644 index 00000000..7b0a43c2 --- /dev/null +++ b/search/fibonacci_search.ts @@ -0,0 +1,56 @@ +/** + * @function fibonacciSearch + * @description Fibonacci search algorithm for a sorted array. + * + * The algorithm searches for a specific value in a sorted array using Fibonacci numbers + * to divide the array into smaller subarrays. This algorithm is useful for large arrays where + * the cost of accessing elements is high. + * + * @param {number[]} array - sorted list of numbers + * @param {number} target - target number to search for + * @return {number} - index of the target number in the list, or -1 if not found + * @see [FibonacciSearch](https://www.geeksforgeeks.org/fibonacci-search/) + * @example fibonacciSearch([1,2,3], 2) => 1 + * @example fibonacciSearch([4,5,6], 2) => -1 + */ + +export const fibonacciSearch = (array: number[], target: number): number => { + const arrayLength = array.length; + let fibNMinusTwo = 0; // (n-2)'th Fibonacci No. + let fibNMinusOne = 1; // (n-1)'th Fibonacci No. + let fibN = fibNMinusTwo + fibNMinusOne; // n'th Fibonacci + + while (fibN < arrayLength) { + fibNMinusTwo = fibNMinusOne; + fibNMinusOne = fibN; + fibN = fibNMinusTwo + fibNMinusOne; + } + + let offset = -1; + + while (fibN > 1) { + let i = Math.min(offset + fibNMinusTwo, arrayLength - 1); + + if (array[i] < target) { + fibN = fibNMinusOne; + fibNMinusOne = fibNMinusTwo; + fibNMinusTwo = fibN - fibNMinusOne; + offset = i; + } else if (array[i] > target) { + fibN = fibNMinusTwo; + fibNMinusOne = fibNMinusOne - fibNMinusTwo; + fibNMinusTwo = fibN - fibNMinusOne; + } else { + // Element found then return index + return i; + } + } + + if (fibNMinusOne && array[offset + 1] === target) { + return offset + 1; + } + + // Element not found then return -1 + return -1; + } + \ No newline at end of file From aed58baf1bcbff4902678fb93210b20fe1a5aaf7 Mon Sep 17 00:00:00 2001 From: Federico Fiaschi Date: Tue, 30 Jul 2024 11:22:12 +0200 Subject: [PATCH 2/7] test: add test for fibonacci search algorithm --- search/test/fibonacci_search.test.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 search/test/fibonacci_search.test.ts diff --git a/search/test/fibonacci_search.test.ts b/search/test/fibonacci_search.test.ts new file mode 100644 index 00000000..6b2a689f --- /dev/null +++ b/search/test/fibonacci_search.test.ts @@ -0,0 +1,18 @@ +import { fibonacciSearch } from "../fibonacci_search"; + +describe('Fibonacci search', () => { + test.each([ + [[1, 2, 3], 2, 1], + [[4, 5, 6], 2, -1], + [[10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100], 85, 8], + [[], 1, -1], + [[1], 1, 0], + [[1, 3, 5, 7, 9, 11, 13], 11, 5], + [[1, 3, 5, 7, 9, 11, 13], 8, -1] + ])( + 'of %o, searching for %o, expected %i', + (array: number[], target: number, expected: number) => { + expect(fibonacciSearch(array, target)).toBe(expected); + } + ); + }); \ No newline at end of file From ab771fb5ef0b200d6d4a5c05b61c159fbd496617 Mon Sep 17 00:00:00 2001 From: Federico Fiaschi Date: Sat, 3 Aug 2024 17:45:59 +0200 Subject: [PATCH 3/7] fix: changed variable names and function return --- search/fibonacci_search.ts | 82 +++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/search/fibonacci_search.ts b/search/fibonacci_search.ts index 7b0a43c2..069677be 100644 --- a/search/fibonacci_search.ts +++ b/search/fibonacci_search.ts @@ -8,49 +8,51 @@ * * @param {number[]} array - sorted list of numbers * @param {number} target - target number to search for - * @return {number} - index of the target number in the list, or -1 if not found + * @return {number | null} - index of the target number in the list, or null if not found * @see [FibonacciSearch](https://www.geeksforgeeks.org/fibonacci-search/) * @example fibonacciSearch([1,2,3], 2) => 1 - * @example fibonacciSearch([4,5,6], 2) => -1 + * @example fibonacciSearch([4,5,6], 2) => null */ -export const fibonacciSearch = (array: number[], target: number): number => { - const arrayLength = array.length; - let fibNMinusTwo = 0; // (n-2)'th Fibonacci No. - let fibNMinusOne = 1; // (n-1)'th Fibonacci No. - let fibN = fibNMinusTwo + fibNMinusOne; // n'th Fibonacci - - while (fibN < arrayLength) { - fibNMinusTwo = fibNMinusOne; - fibNMinusOne = fibN; - fibN = fibNMinusTwo + fibNMinusOne; - } - - let offset = -1; - - while (fibN > 1) { - let i = Math.min(offset + fibNMinusTwo, arrayLength - 1); - - if (array[i] < target) { - fibN = fibNMinusOne; - fibNMinusOne = fibNMinusTwo; - fibNMinusTwo = fibN - fibNMinusOne; - offset = i; - } else if (array[i] > target) { - fibN = fibNMinusTwo; - fibNMinusOne = fibNMinusOne - fibNMinusTwo; - fibNMinusTwo = fibN - fibNMinusOne; - } else { - // Element found then return index - return i; - } - } - - if (fibNMinusOne && array[offset + 1] === target) { - return offset + 1; +export const fibonacciSearch = ( + array: number[], + target: number +): number | null => { + const arrayLength = array.length + let a = 0; // (n-2)'th Fibonacci No. + let b = 1; // (n-1)'th Fibonacci No. + let c = a + b; // n'th Fibonacci + + while (c < arrayLength) { + a = b; + b = c; + c = a + b; + } + + let offset = -1 + + while (c > 1) { + let i = Math.min(offset + a, arrayLength - 1); + + if (array[i] < target) { + c = b; + b = a; + a = c - b; + offset = i; + } else if (array[i] > target) { + c = a; + b = b - a; + a = c - b; + } else { + // Element found then return index + return i; } - - // Element not found then return -1 - return -1; } - \ No newline at end of file + + if (b && array[offset + 1] === target) { + return offset + 1; + } + + // Element not found then return null + return null; +} From e31d1f167eb9f5cdf7257f10dee98016f8a6d30a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Sat, 3 Aug 2024 23:11:17 +0200 Subject: [PATCH 4/7] remove redundant @function --- search/fibonacci_search.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/search/fibonacci_search.ts b/search/fibonacci_search.ts index 069677be..56c6b328 100644 --- a/search/fibonacci_search.ts +++ b/search/fibonacci_search.ts @@ -1,5 +1,4 @@ /** - * @function fibonacciSearch * @description Fibonacci search algorithm for a sorted array. * * The algorithm searches for a specific value in a sorted array using Fibonacci numbers From ae55fe8860b0d874a47e58316820f075f6a4a0a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Sat, 3 Aug 2024 23:13:22 +0200 Subject: [PATCH 5/7] fix tests --- search/test/fibonacci_search.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/search/test/fibonacci_search.test.ts b/search/test/fibonacci_search.test.ts index 6b2a689f..3d73969e 100644 --- a/search/test/fibonacci_search.test.ts +++ b/search/test/fibonacci_search.test.ts @@ -3,16 +3,16 @@ import { fibonacciSearch } from "../fibonacci_search"; describe('Fibonacci search', () => { test.each([ [[1, 2, 3], 2, 1], - [[4, 5, 6], 2, -1], + [[4, 5, 6], 2, null], [[10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100], 85, 8], - [[], 1, -1], + [[], 1, null], [[1], 1, 0], [[1, 3, 5, 7, 9, 11, 13], 11, 5], - [[1, 3, 5, 7, 9, 11, 13], 8, -1] + [[1, 3, 5, 7, 9, 11, 13], 8, null] ])( 'of %o, searching for %o, expected %i', (array: number[], target: number, expected: number) => { expect(fibonacciSearch(array, target)).toBe(expected); } ); - }); \ No newline at end of file + }); From 5bb6396cf163f9819e73a7a0fe14a95321ad2fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Sat, 3 Aug 2024 23:15:44 +0200 Subject: [PATCH 6/7] fix type --- search/test/fibonacci_search.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/search/test/fibonacci_search.test.ts b/search/test/fibonacci_search.test.ts index 3d73969e..19a42f64 100644 --- a/search/test/fibonacci_search.test.ts +++ b/search/test/fibonacci_search.test.ts @@ -11,7 +11,7 @@ describe('Fibonacci search', () => { [[1, 3, 5, 7, 9, 11, 13], 8, null] ])( 'of %o, searching for %o, expected %i', - (array: number[], target: number, expected: number) => { + (array: number[], target: number, expected: number | null) => { expect(fibonacciSearch(array, target)).toBe(expected); } ); From 1fe60c4b1388a7558e15bb99ffad04b421af62d0 Mon Sep 17 00:00:00 2001 From: Lars Mueller Date: Sat, 3 Aug 2024 23:19:25 +0200 Subject: [PATCH 7/7] fix formatting --- search/fibonacci_search.ts | 34 ++++++++++++++-------------- search/test/fibonacci_search.test.ts | 32 +++++++++++++------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/search/fibonacci_search.ts b/search/fibonacci_search.ts index 56c6b328..b0125277 100644 --- a/search/fibonacci_search.ts +++ b/search/fibonacci_search.ts @@ -18,40 +18,40 @@ export const fibonacciSearch = ( target: number ): number | null => { const arrayLength = array.length - let a = 0; // (n-2)'th Fibonacci No. - let b = 1; // (n-1)'th Fibonacci No. - let c = a + b; // n'th Fibonacci + let a = 0 // (n-2)'th Fibonacci No. + let b = 1 // (n-1)'th Fibonacci No. + let c = a + b // n'th Fibonacci while (c < arrayLength) { - a = b; - b = c; - c = a + b; + a = b + b = c + c = a + b } let offset = -1 while (c > 1) { - let i = Math.min(offset + a, arrayLength - 1); + let i = Math.min(offset + a, arrayLength - 1) if (array[i] < target) { - c = b; - b = a; - a = c - b; - offset = i; + c = b + b = a + a = c - b + offset = i } else if (array[i] > target) { - c = a; - b = b - a; - a = c - b; + c = a + b = b - a + a = c - b } else { // Element found then return index - return i; + return i } } if (b && array[offset + 1] === target) { - return offset + 1; + return offset + 1 } // Element not found then return null - return null; + return null } diff --git a/search/test/fibonacci_search.test.ts b/search/test/fibonacci_search.test.ts index 19a42f64..5b2b54b7 100644 --- a/search/test/fibonacci_search.test.ts +++ b/search/test/fibonacci_search.test.ts @@ -1,18 +1,18 @@ -import { fibonacciSearch } from "../fibonacci_search"; +import { fibonacciSearch } from '../fibonacci_search' describe('Fibonacci search', () => { - test.each([ - [[1, 2, 3], 2, 1], - [[4, 5, 6], 2, null], - [[10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100], 85, 8], - [[], 1, null], - [[1], 1, 0], - [[1, 3, 5, 7, 9, 11, 13], 11, 5], - [[1, 3, 5, 7, 9, 11, 13], 8, null] - ])( - 'of %o, searching for %o, expected %i', - (array: number[], target: number, expected: number | null) => { - expect(fibonacciSearch(array, target)).toBe(expected); - } - ); - }); + test.each([ + [[1, 2, 3], 2, 1], + [[4, 5, 6], 2, null], + [[10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100], 85, 8], + [[], 1, null], + [[1], 1, 0], + [[1, 3, 5, 7, 9, 11, 13], 11, 5], + [[1, 3, 5, 7, 9, 11, 13], 8, null] + ])( + 'of %o, searching for %o, expected %i', + (array: number[], target: number, expected: number | null) => { + expect(fibonacciSearch(array, target)).toBe(expected) + } + ) +})