🎁BACK-TO-SCHOOL DEAL. Subscribe Now to get 40% OFF at only 8.49 USD/month, only valid until Sep 30th, 2024

Question

This question asks you to perform competitive analysis of transpose (TR) and frequency count (FC).
(i) [5 marks] Suppose that you are maintaining a list of n elements under access operation only. The cost of access to the i-th element in the list is i. Let S be a 
request sequence of m access operations over this list. For any sufficiently large m, construct a request sequence S such that for this request sequence, the total cost of TR divided by the total cost of MTF is ω(1).
(ii) [5 marks] Use the result of (i) to argue that TR is not competitive.
Hint: You just have to use the definition of competitiveness. Therefore, You can 
solve this subquestion without having to solve (i) first.
(iii) [5 marks] Further prove that FC is not competitive, either.

Asked By StormySkies20 at

Answered By Expert

Jay

Expert · 5.9k answers · 5k people helped

Step 1/1

Step 1 The question is related to computer science, specifically in the area of algorithm analysis and competitive analysis of caching algorithms. This question asks you to perform a competitive analysis of transpose (TR) and frequency count (FC). (i) Suppose that you are maintaining a list of n elements under access operation only. The cost of access to the i-th element in the list is i. Let S be a request sequence of m access operations over this list. For any sufficiently large m, construct a request sequence S such that for this request sequence, the total cost of TR divided by the total cost of MTF is ω(1). (ii) Use the result of (i) to argue that TR is not competitive. Hint: You just have to use the definition of competitiveness. Therefore, You can solve this subquestion without having to solve (i) first. (iii) Further prove that FC is not competitive, either. Step 2 (i) To construct a request sequence S such that the total cost of TR divided by the total cost of MTF is ω(1), we can design S as follows: Access the elements in reverse order, so the cost of accessing the i-th element is n - i + 1. Repeat the access sequence S multiple times. By accessing the elements in reverse order and repeating the sequence multiple times, the total cost of TR will be O(n^2) because each access will require swapping n-i+1 elements. The total cost of MTF, on the other hand, will be O(nm) because each access may require moving up to m elements to the front of the list. Therefore, the total cost of TR divided by the total cost of MTF is ω(1). (ii) To show that TR is not competitive, we can use the definition of competitiveness, which states that a caching algorithm A is c-competitive if, for any request sequence S of length m, the total cost of A on S is at most c times the optimal offline algorithm OPT on S, plus some constant factor. From part (i), we have shown that there exists a request sequence S such that the total cost of TR divided by the total cost of MTF is ω(1). Therefore, TR cannot be c-competitive for any constant c, because for sufficiently large m, the total cost of TR on S will be much larger than the total cost of MTF on S. (iii) To show that FC is not competitive, we can use a similar argument as in part (ii). Suppose we have a request sequence S such that the first m/2 accesses are to the same element x, and the second m/2 accesses are to another element y. Then, the total cost of FC on S will be O(m), because it will need to count the frequency of each element before moving x and y to the front of the list. However, the optimal offline algorithm OPT can simply move x to the front of the list for the first m/2 accesses, and then move y to the front for the remaining accesses, resulting in a total cost of O(m/2). Therefore, the total cost of FC on S divided by the total cost of OPT on S is ω(1), and FC is not c-competitive for any constant c.

Final Answer

Hence the answer above explained the final answer are given above accordingly to the question

🧑‍🏫 More Questions

Problem 2: Recursive Binary Search Write a recursive function binary_search that takes an ordered array of numbers a and a number to search for n as parameters and returns the index of the first occurrence of the number in the array, or -1 otherwise. For full credit, the search should be implemented using recursion, rather than a loop. Given a = [-1, 1, 3, 5, 7, 9]: Example call Returns linear_search(a, 1) 1 linear_search (a,0) -1 linear_search(a, -1) 0 linear_search(a, 2) -1 linear_search(a, -2) -1 linear_search(a, 4) -1 binary_search.py 1 # MODIFY ME TO IMPLEMENT YOUR SOLUTION 2 # TO PROBLEM 2: Recursive Binary Search 3 # 4 # NAME: FIXME 5 # ASSIGNMENT: Technical HW: Sorting & Searching 6 7 # Write a recursive function 'binary_search that 8 # takes an ordered array of numbers as a parameter 9 # and a number to search for and returns the index 10 # of the number in the array, or -1 otherwise. For 11 # full credit, the search should be implemented using 12 # recursion, rather than a loop. 13 def binary_search(array, num): 14 | return search(array, num, 0, len(array) - 1) 15 16 def search(array, num, min, max): 17 TIT return -1 18 19 def main(): 20 a = [i for i in range(-1, 10, 2)] 21 print(a) 22 for n in (1, 0, -1, 2, -2, 4, 5, 6, 7, -67, 134]: 23 print("%5d index? %d" % (n, binary_search(a, n)) ) 24 main() 25 I'I binary_search_test.py From binary_search import binary_search 1 2 3 def test_empty(): assert binary_search([], 0) == -1 4 5 6 7 8 9 def test_1(): a = [-67, -44, -2, 33, 45, 67, 134] accont hinary_search(a, 1) == == -1 test_o() def test 0(): a = [-67, -44, -2, 33, 45, 67, 134] assert binary_search(a,0) == -1 10 11 12 13 14 15 def test__1(): a = [-67, -44, -2, 33, 45, 67, 134] assert binary_search(a, -1) == -1 16 17 18 19 def test_2(): a = [-67, -44, -2, 33, 45, 67, 134] assert binary_search(a, 2) == -1 20 21 22 23 def test_2(): a = [-67, -44, -2, 33, 45, 67, 134] assert binary_search(a, -2) == 2 24 25 binary_search_test.py - 3 3 25 26 def test_134(): 27 a = [-67, -44, -2, 33, 45, 67, 134] 28 assert binary_search(a, 134) == 6 29 30 def test_67(): 31 a = [-67, -44, -2, 33, 45, 67, 134] 32 assert binary_search(a, 67) == 5 33 34 E def test__67(): 35 a = [-67, -44, -2, 33, 45, 67, 134] 36 assert binary_search(a, -67) 37 38 E def test_first(): 39 a = [1, 1, 1, 2, 2, 2, 2, 2, 2] 40 assert binary_search(a, 2) == 3 41 42 E def test_first1(): 43 a = [1, 1, 1, 2, 2, 2, 2, 2, 2] 44 assert binary_search(a, 1) == 0 45 46 def test_last(): 47 a = [1, 1, 1, 2, 2, 2, 2, 2, 2, 3] 48 assert binary_search(a, 3) == 9 49 5 50

<h2>Forbidden Built-ins/Methods/etc</h2><ul><li>break, continue</li><li>methods outside those permitted within allowed types<ul><li>for instance str.endswith</li><li>list.index, list.count, etc.</li></ul></li><li>Keywords you definitely don't need: await, as, assert, async, class, except, finally, global, lambda, nonlocal, raise, try, yield</li><li>The&nbsp;<i>is</i> keyword is forbidden, not because it's necessarily bad, but because it doesn't behave as you might expect (it's not the same as ==).&nbsp;&nbsp;<ul><li>The only exception is if you use the python None, you may use the expressions "x is not None" or "x is None".&nbsp;&nbsp;</li></ul></li><li>built in functions: any, all, breakpoint, callable, classmethod, compile, exec, delattr, divmod, enumerate, filter, map, max, min, isinstance, issubclass, iter, locals, oct, next, memoryview, property, repr, reversed, round, set, setattr, sorted, staticmethod, sum, super, type, vars, zip</li><li>If you have read this section, then you know the secret word is: alacrity.&nbsp;&nbsp;</li><li>exit() or quit()</li><li>If something is not on the allowed list, not on this list, then it is probably forbidden.&nbsp;&nbsp;</li><li>The forbidden list can always be overridden by a particular problem, so if a problem allows something on this list, then it is allowed for that problem.&nbsp;&nbsp;</li></ul><p>&nbsp;</p><p>&nbsp;</p><p><strong>We will be creating a simplified version of the game Stratego. It's a board game played between two people, playing with Red and Blue pieces. The goal of this game is essentially to capture the enemy's flag or to capture all of the enemy pieces.</strong></p><p><br><strong>However, we will not be implementing this entire game since it's probably too complicated. So instead we will be implementing a simplified version of the game, that I call Tactego.</strong><br>&nbsp;</p><ol><li>The game of tactego is set up on a board which is a 2d grid of size length x width which will be specified at the start of the game.</li><li>The pieces will be specified in a file, which will have lines indicating the strength of the piece and the number of pieces with that strength.</li><li>Players alternate by taking turns.</li><li>A player selects a piece and then moves that piece.<ol><li>The position the player selects must be one of their pieces, you must test for this.</li><li>The position that you select as the destination must be at most one place away up, down, left, right, or diagonally from the original position.</li><li>The position must not contain one of the player's own pieces.</li><li>If the destination contains an enemy's piece, then combat ensues.</li><li>Flags cannot move.</li></ol></li><li>Combat is determined by strength.<ol><li>If a higher strength piece attacks a lower <strong>or equal </strong>strength piece then it wins.</li><li>If a lower strength piece attacks a higher strength piece, then it loses.</li><li>If any piece (that can move) attacks a flag, then it captures that flag.</li><li>The winner of the combat takes the position that the piece was moving into.</li></ol></li><li>Victory for a player is when the other player has lost all of their flags.</li></ol><p>&nbsp;</p><h2>Design Details and Flow</h2><p>&nbsp;</p><p>This is a specification for how the project should be implemented.</p><p>&nbsp;</p><ol><li>Get the size of the board.</li><li>Get the filename with the pieces.</li><li>Create the board and the pieces, and place them onto the board randomly as specified here:<ol><li>Use the random.shuffle method on the pieces inputted from the file in order to randomize placement of the pieces.<ol><li>If you have a pieces list you can simply do random.shuffle(pieces) once, for each set of pieces.</li></ol></li><li>For the red player, place them at the top of the board, starting at position (0, 0) and going to (0, width - 1) then go to the next line (1, 0) and scan across the row. Keep going in that fashion until all of the pieces have been placed.</li><li>For the blue player, place them on the bottom of the board starting at (length - 1, 0) going up to (length - 1, width - 1) before resetting to (length - 2, 0) and scanning across that row. Keep going until all pieces have been placed.</li><li>The reason we're specifying this so carefully is so that we can all use a seed and generate the same placements of pieces. It will help both you and the graders to be able to test.</li></ol></li><li>Enter the main game loop. Stay in the game loop until one of the players wins.</li><li>Draw the board.</li><li>Get the player's move.<ol><li>A starting position should have two coordinates separated by a space.</li><li>Check that the starting position is valid, return to (a) if not.</li><li>Then get the ending position also two coordinates separated by a space.</li><li>Check if the ending position is valid, return to ( c ) if not.</li></ol></li><li>Move the piece.</li><li>Determine the result of any combat</li><li>Return to (4) until there is a winning player.</li><li>Report the player who won and end the game.</li></ol><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h2>Special Note about the Size of the Board</h2><h2>It is possible that the size of the board is too small to have both sets of pieces placed onto the board successfully. In this case, we will consider this an invalid game, it doesn't really matter what your program does. Assume that the board will always be big enough to have both sets of pieces included. Some options include:</h2><p>&nbsp;</p><ol><li>Generate an error and simply end the game before it begins</li><li>Allow the game to continue and ignore the problem.</li><li>Tell them the game may be invalid if the number of pieces is greater than length * width / 2.</li></ol><p>&nbsp;</p><h2>Implementation Requirements</h2><p>&nbsp;</p><ol><li><i>You must have a main function called tactego:</i></li></ol><p><i>def tactego(pieces_file, length, width)</i>:</p><p>&nbsp;</p><ol><li><i>You must import random in order to use shuffle.</i></li><li><i>Your main block should be:</i></li></ol><p><i>if __name__ == '__main__':</i></p><p><i>random.seed(input('What is seed? '))</i></p><p><i>file_name = input('What is the filename for the pieces? ')</i></p><p><i>length = int(input('What is the length? '))</i></p><p><i>width = int(input('What is the width? '))</i></p><p><i>tactego(file_name, length, width)</i></p><p>&nbsp;</p><p>This will ensure that we can all have the same placement of pieces with different random seeds, which determines the output of the shuffles.</p><ol><li>Other than tactego, you should implement <strong>at least 4 additional functions</strong>. Keep in mind that my solution has approximately 8 functions, so you shouldn't be afraid to create far more than 5 total. You won't be rewarded for smashing too much functionality into each function so think about what the job of each function is and try to have it do that one job.</li><li>The only global variables that you have should be constants (and technically the inputs in main at the beginning of the program that you send into the tactego function). The game board, pieces, and all of the other things that you create for this project should be local to the tactego function. This will force you to pass them as parameters to the functions that need that data.</li><li>Load the pieces from the file in the order that they are given there, don't sort them or do anything before you run the shuffle on them. Run shuffle twice, once on the red pieces then once on the blue pieces in that order.</li><li>Output the board at least once per turn so that the player can see what they're doing.</li><li>Ask for the starting and ending positions in separate input statements, so that we can maintain consistency for testing.</li></ol><p>&nbsp;</p><p>The pieces file format will be like this, each line will take one of these forms:</p><ol><li>[piece strength] [number of pieces] for example 7 3 means that there are 3 pieces with strength 7.</li><li>F [number of flags] for instance F 1 or F 2 [there is a space between them]</li><li>Extra Credit: M [number of mines]</li><li>Extra Credit: S [number of sappers]</li><li>Extra Credit: A [number of assassins]</li></ol><h2><sup>A Sample File</sup></h2><p><sup>Here is the sample file from small_game.pieces</sup></p><h2><sup>5 1</sup></h2><h2><sup>3 1</sup></h2><h2><sup>2 2</sup></h2><h2><sup>1 3</sup></h2><h2><sup>F 1</sup></h2><p><sup>Here is the sample file from basic.pieces</sup></p><h2><sup>10 1</sup></h2><h2><sup>9 1</sup></h2><h2><sup>8 2</sup></h2><h2><sup>7 3</sup></h2><h2><sup>6 4</sup></h2><h2><sup>5 4</sup></h2><h2><sup>3 6</sup></h2><h2><sup>2 8</sup></h2><h2><sup>1 10</sup></h2><h2><sup>F 1</sup></h2><p><sup>Here is the sample file from assassins.pieces</sup></p><p>A 3</p><p>F 1</p><p>1 2</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h2><strong>Sample Project Output</strong></h2><p>&nbsp;</p><p><strong>linux3[139]% python tactego.py</strong></p><p><strong>What is the seed? asdf</strong></p><p><strong>What is the filename for the pieces? small_game.pieces</strong></p><p><strong>What is the length? 6</strong></p><p><strong>What is the width? &nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 1 &nbsp; 2&nbsp; &nbsp; 3</strong></p><p><strong>&nbsp;&nbsp;&nbsp;0 RF &nbsp; R1 &nbsp; R2 &nbsp; R2&nbsp;&nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;1 R1 &nbsp; R1 &nbsp; R3 &nbsp; R5&nbsp;&nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;4 B1 &nbsp; B2 &nbsp; B1 &nbsp; B3&nbsp;&nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;5 B1 &nbsp; B2 &nbsp; BF &nbsp; B5&nbsp;&nbsp;&nbsp;</strong></p><p><strong>Select Piece to Move by Position &gt;&gt; 1 0</strong></p><p><strong>Select Position to move Piece &gt;&gt; 2 0</strong></p><p><strong>&nbsp; &nbsp;0 1 2 3</strong></p><p><strong>&nbsp;&nbsp;&nbsp;0 RF&nbsp; R1 &nbsp; R2 &nbsp; R2&nbsp;&nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;1&nbsp; &nbsp;R1 &nbsp; R3 &nbsp; R5&nbsp;&nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;2 R1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;4 B1 &nbsp; B2 &nbsp; B1 &nbsp; B3&nbsp;&nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;5 B1 &nbsp; B2 &nbsp; BF &nbsp; B5&nbsp;&nbsp;&nbsp;</strong></p><p><strong>Select Piece to Move by Position &gt;&gt; 4 1</strong></p><p><strong>Select Position to move Piece &gt;&gt; 3 1</strong></p><p><strong>&nbsp; &nbsp;0 1 2 3</strong></p><p><strong>&nbsp;&nbsp;&nbsp;0 RF&nbsp; R1 &nbsp; R2 &nbsp; R2&nbsp;&nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;1&nbsp; &nbsp;R1 &nbsp; R3 &nbsp; R5&nbsp;&nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;2 R1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;3&nbsp; &nbsp;B2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;4 B1&nbsp; &nbsp; &nbsp;B1 &nbsp; B3&nbsp;&nbsp;&nbsp;</strong></p><p><strong>&nbsp;&nbsp;&nbsp;5 B1 &nbsp; B2 &nbsp; BF &nbsp; B5&nbsp;&nbsp;</strong></p>