Data Structures and Performance | Week 4

Course Name: Data Structures and Performance

Course Link: Data Structures and Performance

These are Data Structures and Performance Week 4 Coursera Answers


Programming Assignment: Implement and Test a Linked List

Steps: Create two java files MyLinkedList.java and MyLinkedListTester.java, and upload both files in their respective columns.

MyLinkedList.java:

package textgen;

import java.util.AbstractList;

public class MyLinkedList<E> extends AbstractList<E> {
    LLNode<E> head;
    LLNode<E> tail;
    int size;

    public MyLinkedList() {
        this.head = new LLNode<>(null);
        this.tail = new LLNode<>(null);
        this.head.next = tail;
        this.tail.prev = head;
    }

    public boolean add(E element) {
        if (element == null) {
            throw new NullPointerException("List can't take null");
        }

        LLNode<E> newNode = new LLNode<>(element);
        newNode.prev = tail.prev;
        newNode.next = tail;
        tail.prev.next = newNode;
        tail.prev = newNode;
        this.size++;
        return true;
    }

    public E get(int index) {
        if (index >= size || index < 0) {
            throw new IndexOutOfBoundsException("MyLinkedList get method index outOfBound : " + index);
        } else {
            LLNode<E> targetNode = getNode(index);
            return targetNode.data;
        }
    }

    private LLNode<E> getNode(int index) {
        LLNode<E> currentNode = head;
        for (int i = 0; i <= index; i++) {
            currentNode = currentNode.next;
        }
        return currentNode;
    }

    public void add(int index, E element) {
        if (element == null) {
            throw new NullPointerException("List can't take null");
        }
        if (index > size || index < 0) {
            throw new IndexOutOfBoundsException("LLNode add failed: " + index);
        }
        LLNode<E> newNode = new LLNode<>(element);
        LLNode<E> node = getNode(index);
        newNode.prev = node.prev;
        newNode.next = node;
        newNode.prev.next = newNode;
        node.prev = newNode;
        this.size++;
    }

    public int size() {
        return size;
    }

    public E remove(int index) {
        if (index >= size || index < 0) {
            throw new IndexOutOfBoundsException("LLNode remove outOfBound: " + index);
        }
        LLNode<E> targetNode = getNode(index);
        targetNode.prev.next = targetNode.next;
        targetNode.next.prev = targetNode.prev;
        this.size--;
        return targetNode.data;
    }

    public E set(int index, E element) {
        if (element == null) {
            throw new NullPointerException("List can't take null");
        }
        if (index >= size || index < 0) {
            throw new IndexOutOfBoundsException("LLNode set failed: " + index);
        }
        LLNode<E> node = getNode(index);
        E oldValue = node.data;
        node.data = element;
        return oldValue;
    }

    public String toString() {
        String output = "";
        LLNode<E> curNode = head;
        while (curNode != null) {
            output += curNode.toString();
            curNode = curNode.next;
        }
        return output;
    }
}

class LLNode<E> {
    LLNode<E> prev;
    LLNode<E> next;
    E data;

    public LLNode(E e, LLNode<E> prev) {
        this(e);
        this.prev = prev;
        if (prev != null) {
            prev.next = this;
        }
    }

    public LLNode(E e) {
        this.data = e;
        this.prev = null;
        this.next = null;
    }

    public String toString() {
        return "prev: " + prev + " ,data = " + data + ", next" + next + "\n";
    }
}

These are Data Structures and Performance Week 4 Coursera Answers

See also  Data Structures and Performance | Week 2

MyLinkedListTesting.java:

package textgen;

import static org.junit.Assert.*;

import java.util.LinkedList;

import org.junit.Before;
import org.junit.Test;

public class MyLinkedListTester {

	private static final int LONG_LIST_LENGTH =10; 

	MyLinkedList<String> shortList;
	MyLinkedList<Integer> emptyList;
	MyLinkedList<Integer> longerList;
	MyLinkedList<Integer> list1;

	@Before
	public void setUp() throws Exception {
	    shortList = new MyLinkedList<String>();
		shortList.add("A");
		shortList.add("B");
		emptyList = new MyLinkedList<Integer>();
		longerList = new MyLinkedList<Integer>();
		for (int i = 0; i < LONG_LIST_LENGTH; i++) {
			longerList.add(i);
		}
		list1 = new MyLinkedList<Integer>();
		list1.add(65);
		list1.add(21);
		list1.add(42);
	}

	@Test
	public void testGet() {
		try {
			emptyList.get(0);
			fail("Check out of bounds");
		} catch (IndexOutOfBoundsException e) {
		}
		
		assertEquals("Check first", "A", shortList.get(0));
		assertEquals("Check second", "B", shortList.get(1));
		
		try {
			shortList.get(-1);
			fail("Check out of bounds");
		} catch (IndexOutOfBoundsException e) {
		}
		try {
			shortList.get(2);
			fail("Check out of bounds");
		} catch (IndexOutOfBoundsException e) {
		}
		
		for(int i = 0; i<LONG_LIST_LENGTH; i++ ) {
			assertEquals("Check "+i+ " element", (Integer)i, longerList.get(i));
		}
		
		try {
			longerList.get(-1);
			fail("Check out of bounds");
		} catch (IndexOutOfBoundsException e) {
		}
		try {
			longerList.get(LONG_LIST_LENGTH);
			fail("Check out of bounds");
		} catch (IndexOutOfBoundsException e) {
		}
	}

	@Test
	public void testRemove() {
		try {
			list1.remove(-1);
			fail("AddAtIndex: Add at low index");
		} catch(Exception e) {
		}
		try {
			list1.remove(11);
			fail("AddAtIndex: Add at low index");
		} catch(Exception e) {
		}
		int a = list1.remove(0);
		assertEquals("Remove: check a is correct ", 65, a);
		assertEquals("Remove: check element 0 is correct ", (Integer)21, list1.get(0));
		assertEquals("Remove: check size is correct ", 2, list1.size());
		assertEquals("remove: check link after remove", list1.head, list1.head.next.prev);
	}
	
	@Test(expected = IndexOutOfBoundsException.class)
	public void testRemoveOutOfBounds() {
		list1.remove(-1);
	}

	@Test(expected = IndexOutOfBoundsException.class)
	public void testRemoveOutOfBounds2() {
		list1.remove(11);
	}
	
	@Test
	public void testAddEnd() {
		try {
			list1.add(null);
			fail("addEnd : Can't add null");
		} catch(Exception e) {
		}
		emptyList.add(1);
		assertEquals("Add: add one element is correct", (Integer)1, emptyList.get(0));
		assertEquals("Add: add one element size is correct", (int) 1, emptyList.size());
	}

	@Test
	public void testSize() {
		int size = list1.size();
		assertEquals("List1 size is correct", 3, size);
		list1.remove(0);
		assertEquals("List1 size is 2 after remove 1 element", 2, list1.size());
		list1.add(110);
		assertEquals("List1 size is 3 afer add one element", 3, list1.size());
	}

	@Test
	public void testAddAtIndex() {
		try {
			list1.add(-1, -111);
			fail("AddAtIndex: Add at low index");
		} catch(Exception e) {
		}
		try {
			list1.add(11, 11);
			fail("AddAtIndex: Add at low index");
		} catch(Exception e) {
		}
		try {
			list1.add(1, null);
			fail("AddAtIndex : Can't add null");
		} catch(Exception e) {
		}
		shortList.add(0, "test");
		assertEquals("addAtIndex: check value", shortList.get(0), "test");
		assertEquals("addAtIndex: check value behind new item", shortList.get(1), "A");
		assertEquals("addAtIndex: check size after addition", shortList.size(), 3);
	}

	@Test
	public void testSet() {
		try {
			list1.set(-1, -111);
			fail("AddAtIndex: Add at low index");
		} catch(Exception e) {
		}
		try {
			list1.set(11, 11);
			fail("AddAtIndex: Add at low index");
		} catch(Exception e) {
		}
		list1.set(0, 110);
		assertEquals("set: check new value is set ", (Integer) 110, list1.get(0) );
		assertEquals("set: check size afeter value is set", 3, list1.size());
	}

	@Test
	public void testHeadTail() {
		assertEquals("Head Tail: check head",  list1.head, list1.head.next.prev);
		assertEquals("Head Tail: check tail", list1.tail, list1.tail.prev.next);
	}
}

These are Data Structures and Performance Week 4 Coursera Answers

See also  Data Structures and Performance | Week 1

Week 4 Reflective Programming Assignment Quiz

Q1. How much time did it take to complete the MyLinkedList project (both implementation and tester)?

  • < 1 hour
  • 1-2 hours
  • 2-3 hours
  • 3-4 hours
  • 4-5 hours
  • 5+ hours
Answer: < 1 hour

These are Data Structures and Performance Week 4 Coursera Answers


Q2. How difficult would you rate the MyLinkedList assignment relative to other programming projects you’ve done (in and outside this course)?

  • Extremely easy
  • Easy
  • Somewhat Easy
  • Somewhat Difficult
  • Difficult
  • Extremely Difficult
Answer: Somewhat Easy

These are Data Structures and Performance Week 4 Coursera Answers


Q3. Did you enjoy the MyLinkedList programming assignment?

  • I really enjoyed the programming assignment
  • I enjoyed the programming assignment
  • I am neutral about the programming assignment
  • I did not enjoy the programming assignment
  • I really did not enjoy the programming assignment
Answer: I enjoyed the programming assignment

These are Data Structures and Performance Week 4 Coursera Answers


Q4. Please tell us, in 1-2 sentences, what was the trickiest part for you about the MyLinkedList assignment (including either implementation or testing).

Answer: In a linked list, reverse traversing is challenging.

These are Data Structures and Performance Week 4 Coursera Answers


Q5. Did you do the optional Markov Text Generation Project?

  • Yes, and I got it working!
  • Yes, but I didn’t quite finish it or didn’t quite get it working completely
  • No
Answer: Yes, and I got it working!

These are Data Structures and Performance Week 4 Coursera Answers


Q6. How long did you work on the Markov Text Generator Extension?

  • Not applicable (I didn’t work on the Markov Text Generator)
  • < 1 hour
  • 1-2 hours
  • 2-3 hours
  • 3-4 hours
  • 4 hours
Answer: < 1 hour

These are Data Structures and Performance Week 4 Coursera Answers

See also  Data Structures and Performance | Week 5

Q7. How difficult would you rate the Markov Text Generator extension relative to other programming projects you’ve done (in and outside this course)?

  • Extremely easy
  • Easy
  • Somewhat easy
  • Somewhat hard
  • Hard
  • Extremely hard
Answer: Somewhat easy

These are Data Structures and Performance Week 4 Coursera Answers


Q8. Did you enjoy the programming assignment on Markov Text Generation

  • Not applicable
  • I really enjoyed the programming assignment.
  • I enjoyed the programming assignment.
  • I am neutral about the programming assignment.
  • I did not enjoy the programming assignment.
  • I really did not enjoy the programming assignment.
Answer: I enjoyed the programming assignment.

These are Data Structures and Performance Week 4 Coursera Answers


Q9. Please tell us, in 1-2 sentences, what was the trickiest part for you about the Markov Text Generator extension (including either implementation or testing).

Answer: The Evaluation Problem and the Forward Algorithm.

These are Data Structures and Performance Week 4 Coursera Answers


More Weeks of the course: Click Here

More Coursera courses: https://progiez.com/coursera

Data Structures and Performance Week 4 Coursera Answers