# 算法代写｜COSC 2123/1285 Algorithms and Analysis Assignment 1: Word Completion

### 算法代写｜COSC 2123/1285 Algorithms and Analysis Assignment 1: Word Completion

1 Objectives

There are a number of key objectives for this assignment:

• Understand how a real-world problem can be implemented by different data structures and/or algorithms.
• Evaluate and contrast the performance of the data structures and/or algorithms with respect to different usage scenarios and input data.

In this assignment, we focus on the word completion problem.

2 Background

Array-Based Dictionary

Python’s built-in ‘list’ is equivalent to ‘array’ in other language. In fact, it is a dynamic array in the sense that its resizing operation (when more elements are inserted into the array than the original size) is managed automatically by Python. You can initialize an empty array in Python, add elements at the end of the array, remove the first instant of a given value by typing the following commands(e.g., on Python’s IDLE Shell).

>>> array = []

>>> array.append(5)

>>> array.append(10)

>>> array.append(5)

>>> array

[5, 10, 5]

>>> array.remove(5)

>>> array

[10, 5]

In the array-based dictionary implementation, we use the Python list (a data structure) to implement common operations for a dictionary (an abstract data type). We treat each element of the array as a pair (word, frequency) (defined as an object of the simple class WordFrequency), where word is an English word (a string), e.g., ‘ant’, and frequency is its usage frequency (a non-negative integer), e.g., 1000, in a certain context, e.g., in some forums or social networks.

The array must be sorted in the alphabetical order, i.e., ‘ant’ appears before ‘ape’, to facilitate search. A new word, when added to the dictionary, should be inserted at a correct location that preserves the alphabetical order (using the module bisect is allowed – but you need to know what it does). An example of a valid array is [(‘ant’, 1000), (‘ape’, 200), (‘auxiliary’, 2000)].

Adding (‘app’, 500) to the array, we will have [(‘ant’, 1000), (‘ape’, 200), (‘app’, 500),(‘auxiliary’, 2000)]. Note that the pair (‘ant’, 1000) in our actual implementation should be an object of the class WordFrequency and not a tuple.

A Search for ‘ape’ from the array above should return its frequency 200. If the word doesn’t exist,0 is returned.

A Delete for a word in the dictionary should return True and remove the word from the dictionary if it exists, and return False otherwise.

An Autocompletion for a string should return a sorted list (most frequent words appear fifirst) of the three words (if any) of highest frequencies in the dictionary that have the given string as a prefifix.

For the array above, an autocompletion for ‘ap’ should return the list [(‘app’, 500),(‘ape’, 200)].

Notice that while both ‘app’ and ‘ape’ have ‘ap’ as a prefifix, ‘app’ has a larger frequency and appears fifirst in the returned list of autocompletion.

A linked list is precisely what it is called: a list of nodes linked together by references. In a singly linked list, each node consists of a data item, e.g., a string or a number, and a reference that holds the memory location of the next node in the list (the reference in the last node is set to Null). Each linked list has a head, which is the reference holding memory location of the fifirst node in the list. Once we know the head of the list, we can access all nodes sequentially by going from one node to the next using references until reaching the last node.

In the linked-list-based implementation of dictionary, we use an unsorted singly linked list. You can use the implementation of the linked list in the workshop as a reference for your implementation.

Each node stores as data a pair of (word, frequency) (an object of the class WordFrequency) and a reference to the next node. A word and its frequency are added as a new node at the front of the list by updating the head reference. Apart from the fact that they are carried out in the linked list,Search, Delete, and Autocomplete work similarly as in the array-based implementation. Note that unlike the array-based dictionary, the words in the linked list are not sorted.

Trie-Based Dictionary

Trie (pronounced as either ‘tree’ or ‘try’) is a data structure storing (key, value) pairs where keys are strings that allows fast operations such as spell checking and auto-completion. Introduced in the context of computer decades ago, it is no longer the most efficient data structure around. However,our purpose is to focus more on the understanding of what data structures mean, how they can be used to implement an abstract data type, and to empirically evaluate their performance. Thus, we stick to the original/simple idea of ‘trie’. You are strongly encouraged to read about more advanced data structures evolving from trie.

Each node of a trie contains the following fields:

• a lower-case letter from the English alphabet (‘a’ to ‘z’), or Null if it is the root,
• a boolean variable that is True if this letter is the last letter of a word in the dictionary and False otherwise,
• a positive integer indicating the word’s frequency (according to some dataset) if the letter is the last letter of a word in the dictionary,
• an array of A = 26 elements (could be Null) storing references pointing to the children nodes.

In our implementation, for convenience, we use a hashtable/Python’s dictionary to store the children.

As an example, consider Figure 1.