From 8767d0b1306d52d4aa0334c4718b6599ac8ffb40 Mon Sep 17 00:00:00 2001 From: Exortions Date: Sat, 7 May 2022 18:36:04 -0700 Subject: [PATCH 1/2] 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/2] 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 + ) + }) +})

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