From 8767d0b1306d52d4aa0334c4718b6599ac8ffb40 Mon Sep 17 00:00:00 2001 From: Exortions Date: Sat, 7 May 2022 18:36:04 -0700 Subject: [PATCH 1/3] add yt video association algorithm --- Search/YoutubeVideoAssociation.js | 54 +++++++++++++++++++++ Search/test/YoutubeVideoAssociation.test.js | 25 ++++++++++ 2 files changed, 79 insertions(+) create mode 100644 Search/YoutubeVideoAssociation.js create mode 100644 Search/test/YoutubeVideoAssociation.test.js diff --git a/Search/YoutubeVideoAssociation.js b/Search/YoutubeVideoAssociation.js new file mode 100644 index 0000000000..a729b64d72 --- /dev/null +++ b/Search/YoutubeVideoAssociation.js @@ -0,0 +1,54 @@ +class AssociationAlgorithm { + constructor (requiredPercentageForAsssociation = 10) { + this.REQUIRED_PERCENTAGE_FOR_ASSOCIATION = requiredPercentageForAsssociation + + this.associations = {} + this.searches = {} + } + + #associate (id, query) { + if (!this.associations[id]) { this.associations[id] = [] } + + this.associations[id].push(query) + } + + #search (id, query) { + if (!this.searches[id]) { this.searches[id] = [] } + + let search = Number(this.searches[id][query]) + + if (!search) search = 0 + + this.searches[id][query] = search + 1 + } + + // Main function to run the algorithm + search (data) { + const { id, views } = data.video + const { query } = data.search + + if (!this.associations[id]) this.associations[id] = [] + + this.#search(id, query) + + const percentageOfViewsFromSearch = (Number(this.searches[id][query]) / Number(views)) * 100 + + if (percentageOfViewsFromSearch> this.REQUIRED_PERCENTAGE_FOR_ASSOCIATION) { + // Associate the video with the search query + + this.#associate(id, query) + } else { + // The video does not have a high enough percentage of views from the query to be associated with it + } + } + + isVideoAssociated (id, query) { + return this.associations[id] && this.associations[id].includes(query) + } + + getAssociations (id) { + return this.associations[id] + } +} + +export default AssociationAlgorithm diff --git a/Search/test/YoutubeVideoAssociation.test.js b/Search/test/YoutubeVideoAssociation.test.js new file mode 100644 index 0000000000..c81bec76f0 --- /dev/null +++ b/Search/test/YoutubeVideoAssociation.test.js @@ -0,0 +1,25 @@ +import AssociationAlgorithm from '../YoutubeVideoAssociation' + +describe('Youtube Video Association Algorithm', () => { + const search = { + video: { + id: 'dQw4w9WgXcQ', + views: '100' + }, + search: { + query: 'Rick Roll' + } + } + + const algorithm = new AssociationAlgorithm(10) + + test('The video should not be associated after one search', () => { + algorithm.search(search) + + expect(algorithm.isVideoAssociated('dQw4w9WgXcQ', 'Rick Roll')).toBe(false) + }) + + test('The video should be associated after 11 searches', () => { + for (let i = 0; i < 10; i++) algorithm.search(search) + }) +}) From 78e3cb870de677032459b13c39d9285173a3bc27 Mon Sep 17 00:00:00 2001 From: Exortions Date: Sat, 7 May 2022 22:02:04 -0700 Subject: [PATCH 2/3] Implement FindMaxRecursion in JS --- Maths/FindMaxRecursion.js | 38 +++++++++++++++++++ Maths/test/FindMaxRecursion.test.js | 58 +++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 Maths/FindMaxRecursion.js create mode 100644 Maths/test/FindMaxRecursion.test.js diff --git a/Maths/FindMaxRecursion.js b/Maths/FindMaxRecursion.js new file mode 100644 index 0000000000..a95eb68406 --- /dev/null +++ b/Maths/FindMaxRecursion.js @@ -0,0 +1,38 @@ +/** + * @function findMaxRecursion + * @description This algorithm will find the maximum value of a array of numbers. + * + * @param {Integer[]} arr Array of numbers + * @param {Integer} left Index of the first element + * @param {Integer} right Index of the last element + * + * @return {Integer} Maximum value of the array + * + * @see [Maximum value](https://en.wikipedia.org/wiki/Maximum_value) + * + * @example findMaxRecursion([1, 2, 4, 5]) = 5 + * @example findMaxRecursion([10, 40, 100, 20]) = 100 + * @example findMaxRecursion([-1, -2, -4, -5]) = -1 + */ +function findMaxRecursion(arr, left, right) { + const len = arr.length + + if (len === 0 || !arr) return undefined + + if (left>= len || left < -len || right>= len || right < -len) + throw new Error('Index out of range') + + if (left === right) return arr[left] + + // left + right shifted is the middle index + const mid = (left + right)>> 1 + + // Find the maximum of left and right + const leftMax = findMaxRecursion(arr, left, mid) + const rightMax = findMaxRecursion(arr, mid + 1, right) + + // Return the maximum + return Math.max(leftMax, rightMax) +} + +export { findMaxRecursion } diff --git a/Maths/test/FindMaxRecursion.test.js b/Maths/test/FindMaxRecursion.test.js new file mode 100644 index 0000000000..4772eeb1d3 --- /dev/null +++ b/Maths/test/FindMaxRecursion.test.js @@ -0,0 +1,58 @@ +import { findMaxRecursion } from '../FindMaxRecursion' + +describe('Test findMaxRecursion function', () => { + const positiveAndNegativeArray = [1, 2, 4, 5, -1, -2, -4, -5] + const positiveAndNegativeArray1 = [10, 40, 100, 20, -10, -40, -100, -20] + + const positiveArray = [1, 2, 4, 5] + const positiveArray1 = [10, 40, 100, 20] + + const negativeArray = [-1, -2, -4, -5] + const negativeArray1 = [-10, -40, -100, -20] + + const zeroArray = [0, 0, 0, 0] + const emptyArray = [] + + it('Testing with positive arrays', () => { + expect(findMaxRecursion(positiveArray, 0, positiveArray.length - 1)).toBe(5) + expect(findMaxRecursion(positiveArray1, 0, positiveArray1.length - 1)).toBe( + 100 + ) + }) + + it('Testing with negative arrays', () => { + expect(findMaxRecursion(negativeArray, 0, negativeArray.length - 1)).toBe( + -1 + ) + expect(findMaxRecursion(negativeArray1, 0, negativeArray1.length - 1)).toBe( + -10 + ) + }) + + it('Testing with positive and negative arrays', () => { + expect( + findMaxRecursion( + positiveAndNegativeArray, + 0, + positiveAndNegativeArray.length - 1 + ) + ).toBe(5) + expect( + findMaxRecursion( + positiveAndNegativeArray1, + 0, + positiveAndNegativeArray1.length - 1 + ) + ).toBe(100) + }) + + it('Testing with zero arrays', () => { + expect(findMaxRecursion(zeroArray, 0, zeroArray.length - 1)).toBe(0) + }) + + it('Testing with empty arrays', () => { + expect(findMaxRecursion(emptyArray, 0, emptyArray.length - 1)).toBe( + undefined + ) + }) +}) From f784ecfd6a9cb159b5f1b6285400491bb903c433 Mon Sep 17 00:00:00 2001 From: Exortions <75327059+exortions@users.noreply.github.com> Date: Sat, 7 May 2022 22:09:59 -0700 Subject: [PATCH 3/3] Delete file in other PR --- Search/YoutubeVideoAssociation.js | 54 ------------------------------- 1 file changed, 54 deletions(-) delete mode 100644 Search/YoutubeVideoAssociation.js diff --git a/Search/YoutubeVideoAssociation.js b/Search/YoutubeVideoAssociation.js deleted file mode 100644 index a729b64d72..0000000000 --- a/Search/YoutubeVideoAssociation.js +++ /dev/null @@ -1,54 +0,0 @@ -class AssociationAlgorithm { - constructor (requiredPercentageForAsssociation = 10) { - this.REQUIRED_PERCENTAGE_FOR_ASSOCIATION = requiredPercentageForAsssociation - - this.associations = {} - this.searches = {} - } - - #associate (id, query) { - if (!this.associations[id]) { this.associations[id] = [] } - - this.associations[id].push(query) - } - - #search (id, query) { - if (!this.searches[id]) { this.searches[id] = [] } - - let search = Number(this.searches[id][query]) - - if (!search) search = 0 - - this.searches[id][query] = search + 1 - } - - // Main function to run the algorithm - search (data) { - const { id, views } = data.video - const { query } = data.search - - if (!this.associations[id]) this.associations[id] = [] - - this.#search(id, query) - - const percentageOfViewsFromSearch = (Number(this.searches[id][query]) / Number(views)) * 100 - - if (percentageOfViewsFromSearch> this.REQUIRED_PERCENTAGE_FOR_ASSOCIATION) { - // Associate the video with the search query - - this.#associate(id, query) - } else { - // The video does not have a high enough percentage of views from the query to be associated with it - } - } - - isVideoAssociated (id, query) { - return this.associations[id] && this.associations[id].includes(query) - } - - getAssociations (id) { - return this.associations[id] - } -} - -export default AssociationAlgorithm

AltStyle によって変換されたページ (->オリジナル) /