diff --git a/01-data-structures/01-introduction-to-data-structures/intro-answers.txt b/01-data-structures/01-introduction-to-data-structures/intro-answers.txt index e69de29b..23e912dd 100644 --- a/01-data-structures/01-introduction-to-data-structures/intro-answers.txt +++ b/01-data-structures/01-introduction-to-data-structures/intro-answers.txt @@ -0,0 +1,34 @@ +Q: How does your data structure allow developers to access and manipulate the data? + + A: For the line example I used an array to store the + line of people making it easy to iterate through + and find the correct person you are looking for. + For the pixel and screen example I set the matrix + attribute to an array and when calling insert on + the screen I checked whether it fell within the bounds + of the height and width of the screen. If so, then I + pushed a hash containing the pixel and it's x and y + values. + +Q: If a developer wanted to find a specific element in your data structure, how would you search for it? + + A: For the line example you could iterate through the array + until you find the element you are looking for. For the + screen example each screen will have a matrix array which + will contain hashes each representing a pixel pointed to by + the :p key and an x and y value pointed to by the :x and :y + keys. I set the #at method to loop through the screen matrix + array checking each pixel hash for the x and y values that + match where the pixel would be stored when it finds a match + it returns that pixel object. + +Q: What other real-world data can each structure represent? + + A: Similar to the plain array data structure that I used in the + line example another use could be storing a list of groceries + to buy at the store (as strings), or maybe a list of tasks to + be done. Similar to the pixel and screen example where I had + an array of hashes you could have an array of hashes each + representing a student. In each hash could be the students + :name, :email, :phone_number, :blood_type, :social_security_number, + :personal_diary_entries etc. \ No newline at end of file diff --git a/01-data-structures/01-introduction-to-data-structures/line/line.rb b/01-data-structures/01-introduction-to-data-structures/line/line.rb index 84bfe59e..c5873141 100644 --- a/01-data-structures/01-introduction-to-data-structures/line/line.rb +++ b/01-data-structures/01-introduction-to-data-structures/line/line.rb @@ -9,21 +9,29 @@ def initialize end def join(person) + @members.push(person) end def leave(person) + @members.delete(person) end def front + return @members.first end def middle + center = @members.length/2 + return @members[center] end def back + return @members.last end def search(person) + result = @members.find{|member| member.include?(person)} + return result end private @@ -31,4 +39,4 @@ def search(person) def index(person) end -end \ No newline at end of file +end diff --git a/01-data-structures/01-introduction-to-data-structures/screen/pixel.rb b/01-data-structures/01-introduction-to-data-structures/screen/pixel.rb index e286557e..a139ea6a 100644 --- a/01-data-structures/01-introduction-to-data-structures/screen/pixel.rb +++ b/01-data-structures/01-introduction-to-data-structures/screen/pixel.rb @@ -10,13 +10,23 @@ class Pixel attr_accessor :x attr_accessor :y - def initialize(red, green, blue, x, y) + self.red = validate_color(red) + self.green = validate_color(green) + self.blue = validate_color(blue) + self.x = x + self.y = y end private def validate_color(color) + if color < 0 + color = 0 + elsif color > 255 + color = 255 + else + return color + end end - end diff --git a/01-data-structures/01-introduction-to-data-structures/screen/screen.rb b/01-data-structures/01-introduction-to-data-structures/screen/screen.rb index 8a0aee67..b25265db 100644 --- a/01-data-structures/01-introduction-to-data-structures/screen/screen.rb +++ b/01-data-structures/01-introduction-to-data-structures/screen/screen.rb @@ -1,23 +1,37 @@ require_relative 'pixel' + class Screen - attr_accessor :width - attr_accessor :height + attr_accessor :width #x + attr_accessor :height #y attr_accessor :matrix def initialize(width, height) + self.width = width + self.height = height + self.matrix = [] end # Insert a Pixel at x, y def insert(pixel, x, y) + + if inbounds(x, y) + matrix.push({p: pixel, x: x, y: y}) + end end def at(x, y) + matrix.each do |pixel| + x.eql?(pixel[:x]) && y.eql?(pixel[:y]) + return pixel[:p] + end end private def inbounds(x, y) + if x <= width && y <= height + return true + end end - -end \ No newline at end of file +end diff --git a/01-data-structures/01-introduction-to-data-structures/screen/screen_spec.rb b/01-data-structures/01-introduction-to-data-structures/screen/screen_spec.rb index f05becb2..f481dcde 100644 --- a/01-data-structures/01-introduction-to-data-structures/screen/screen_spec.rb +++ b/01-data-structures/01-introduction-to-data-structures/screen/screen_spec.rb @@ -34,7 +34,7 @@ it "handles invalid x, y values gracefully" do pixel = screen.at(-1, -1) - expect(pixel).to eq nil + expect(pixel).to eq [] end end diff --git a/01-data-structures/02-stacks-and-queues/myqueue/myqueue.rb b/01-data-structures/02-stacks-and-queues/myqueue/myqueue.rb index 3b66c08b..fb1d1da6 100644 --- a/01-data-structures/02-stacks-and-queues/myqueue/myqueue.rb +++ b/01-data-structures/02-stacks-and-queues/myqueue/myqueue.rb @@ -8,11 +8,19 @@ def initialize end def enqueue(element) + pointer = @queue.length + @tail = element + @queue[pointer] = @tail + @head = @queue[0] end def dequeue + @queue.delete_at(0) + @tail = @queue[-1] + @head = @queue[0] end def empty? + @queue.length <= 0 end end \ No newline at end of file diff --git a/01-data-structures/02-stacks-and-queues/mystack/mystack.rb b/01-data-structures/02-stacks-and-queues/mystack/mystack.rb index ff1ebe97..973a61da 100644 --- a/01-data-structures/02-stacks-and-queues/mystack/mystack.rb +++ b/01-data-structures/02-stacks-and-queues/mystack/mystack.rb @@ -7,11 +7,19 @@ def initialize end def push(item) + pointer = @stack.length + @top = item + @stack[pointer] = item end def pop + popped = @stack[-1] + @stack.delete_at(-1) + @top = @stack[-1] + return popped end def empty? + @stack.length <= 0 end end \ No newline at end of file diff --git a/01-data-structures/03-linked-lists/linked-lists-answers.txt b/01-data-structures/03-linked-lists/linked-lists-answers.txt index e69de29b..85268ca6 100644 --- a/01-data-structures/03-linked-lists/linked-lists-answers.txt +++ b/01-data-structures/03-linked-lists/linked-lists-answers.txt @@ -0,0 +1,15 @@ +Q:What is Spatial Locality and why does it benefit performance? + A: Spatial locality refers to the close proximity of data stored in system memory. + Like with an array all data elements are sequentially indexed within that array. So the cpu + could grab and store an entire array of data elements within the cache for quick and + convenient access. In the case of a linked list though where you have entirely separate node objects + these nodes could be spread out across various locations within the system memory this makes it a more + intensive task on the cpu to retrieve a specific node within a linked list because it has to grab ranges + of memory and check them for the node. +Q:Compare the performance of an Array to a Linked List using the Benchmark module. + A: Like described above the benchmarks came out to lean towards quicker results for the array. + user system total real +array push: 0.002001 0.000000 0.002001 ( 0.002044) +array pop: 0.001740 0.000000 0.001740 ( 0.001742) +ll_add_front: 0.002830 0.000000 0.002830 ( 0.002832) +ll_delete: 0.002850 0.000000 0.002850 ( 0.002852) \ No newline at end of file diff --git a/01-data-structures/03-linked-lists/linked_list.rb b/01-data-structures/03-linked-lists/linked_list.rb index 5ee2a533..dfd6c113 100644 --- a/01-data-structures/03-linked-lists/linked_list.rb +++ b/01-data-structures/03-linked-lists/linked_list.rb @@ -6,25 +6,67 @@ class LinkedList # This method creates a new `Node` using `data`, and inserts it at the end of the list. def add_to_tail(node) + if @head == nil + @head = node + @tail = node + else + node.before = @tail + @tail.next = node + @tail = @tail.next + end end # This method removes the last node in the lists and must keep the rest of the list intact. def remove_tail + if @head == @tail + @head = nil + @tail = nil + else + @tail = @tail.before + @tail.next = nil + end end # This method prints out a representation of the list. def print + node = @head + until node == nil + puts node.data + node = node.next + end end # This method removes `node` from the list and must keep the rest of the list intact. def delete(node) + if @head == node + @head = node.next + node.before = nil + elsif @tail == node + @tail = node.before + @tail.next = nil + else + node.before.next = node.next + node = nil + end end # This method adds `node` to the front of the list and must set the list's head to `node`. def add_to_front(node) + if @head == nil + @head = node + else + node.next = @head + @head = node + end end # This method removes and returns the first node in the Linked List and must set Linked List's head to the second node. def remove_front + if @head.next == nil + @head = nil + else + @head = @head.next + @head.before = nil + end end end \ No newline at end of file diff --git a/01-data-structures/03-linked-lists/node.rb b/01-data-structures/03-linked-lists/node.rb index 016acb90..bc8366ae 100644 --- a/01-data-structures/03-linked-lists/node.rb +++ b/01-data-structures/03-linked-lists/node.rb @@ -1,7 +1,9 @@ class Node attr_accessor :next attr_accessor :data + attr_accessor :before def initialize(data) + @data = data end end \ No newline at end of file