Data Structures - Long Island University

Download Report

Transcript Data Structures - Long Island University

Arrays and Lists

Properties
◦ Contents are stored in contiguous memory
locations
◦ Elements of the array are of the same type
 (Perl allows for different types, but then Perl’s strange
that way)
◦ Direct access of elements possible using a cardinal
indexer
 Index is used as the “offset” from the beginning of the
array
◦ Operations
 Allocation
 Accessing

C#
◦ Initial declaration makes a “null” value array
 bool [] booleanArray;
 arrayName = new arrayType[allocationSize];
◦ Contiguous block of memory is allocated
 Which is why the allocation size is required up front
 Adding elements later cannot extend this memory “block”
 Each element in the array is of the “type”
 bool or int would be elements of that type value
 FileInfo is a reference, so the elements would be of that type, which
are references to the actual objects, and not the object per se
bool [] booleanArray;
FileInfo [] files;
booleanArray = new bool[10];
files = new FileInfo[10];
// Read an array element
bool b = booleanArray[7];
// Write to an array element
booleanArray[0] = false;

Running time is O(1)
◦ Constant, regardless of how many elements are stored
 In reality
 Managed code
 Lookup will take extra running time for integrity (indexbounds) check of element costing performance
 Possible to use unmanaged code for access

Make a larger array and then copy the old over array to the
new array
◦ Unassigned values in the new array have the default “0” value
◦ Don’t forget that the old array is still allocated in memory
// Create an integer array with three elements
int [] fib = new int[3];
fib[0] = 1;
fib[1] = 1;
fib[2] = 2;
// Redimension message to a 10 element array
int [] temp = new int[10];
// Copy the fib array to temp
fib.CopyTo(temp, 0);
// Assign temp to fib
fib = temp;

Good for
◦ storing homogeneous data types
◦ Only accessing them directly

Searching unsorted array
◦ Linear running time

If storing large arrays which are searched frequently
◦ Consider other structures

Sorted array
◦ Binary search can be used to search the array
 Running time is O(log N)


Array class has a BinarySearch() method
Multidimensional arrays
◦ Runtime is O(Nk) where “k” is the number of dimension

Customization of a structure for application
◦ Process array of class Employee with its methods
and properties
 might want extra functionality not present in array or
in order to resize the array if needed
 Create a custom data structure with of Employee
 Or.. The array can be of type object
 This can store any data type (all types derive from object in
.Net Framework)
 .Net Framework has such a structure
 System.Collections.ArrayList class
 Internal object array
 When reading value from ArrayList, cast it to data type
being stored

Flexibility is obtained at the expense of
performance
◦ Each array element is a reference to an object

Performance cost due to indirection and boxing/unboxing of data
◦ Boxing is the conversion a value type to a reference type

Allocate memory from heap

Amount of memory is size needed by the value type plus additional overhead to make this
an object

Pointer to virtual method table and pointer to a ‘sync block’


Copy value type’s bit to heap
Return address of the object (reference type)

Retrieve a reference to the value type in an object
◦ Unboxing



Array of objects
◦ Potential run time errors

Wrong data type is added to an element at run time



CLR checks reference type variable is not null and boxed value of the type desired
Pointer to the value is returned
This is not caught at compile time
Bug won’t be caught until testing or actual production run
Typing problem with ArrayList is fixed in .Net Framework with Generics
Type identifier (T) is defined.
specify a
as “T”).
public class TypeSafeList<T>
Requires developer to
{
SINGLE type (aliased
T[] innerArray = new T[0];
int currentSize = 0;
int capacity = 0;
public void Add(T item)
{ // see if array needs to be resized
if (currentSize == capacity)
{ // resize array
capacity = capacity == 0 ? 4 : capacity * 2;
// double capacity
T[] copy = new T[capacity];
// create newly sized array
Array.Copy(innerArray, copy, currentSize);
// copy over the array
innerArray = copy;
// assign innerArray to the new, larger array
}
innerArray[currentSize] = item;
currentSize++;
}
public T this[int index]
{
get
{
if (index < 0 || index >= currentSize)
throw new IndexOutOfRangeException();
return innerArray[index];
}
set
{
if (index < 0 || index >= currentSize)
throw new IndexOutOfRangeException();
innerArray[index] = value;
}
}
public override string ToString()
{
string output = string.Empty;
for (int i = 0; i < currentSize - 1; i++)
output += innerArray[i] + ", “;
return output + innerArray[currentSize - 1];
}
}
TypeSafeList<type> variableName;
 Sample code
TypeSafeList<int> fib = new TypeSafeList<int>();
fib.Add(1);
fib.Add(1);
for (int i = 2; i < 25; i++)
fib.Add(fib[i - 2] + fib[i - 1]);
Console.WriteLine(fib.ToString());

Benefits
◦ Type safety
 Can only add elements of “type” declare or derived
from declared type
 Adding a string to the “fib” example would result in a
compile time error rather than run time error
◦ Performance
 No type checking required at run time
 Boxing/unboxing is eliminated
◦ Reusable
 Break the coupling between the data structure and the
specific application for which it was created



Homogeneous array
Self-redimensioning array
List is a “wrapper” for array
◦ Provides read/write access to array
◦ Automatically resizes the array as required
◦ Utilizes Generics
 Type is specified at development time
 Specified in declaration and instantiation of List
 No size is required in declaration
 Can specify a default starting size in the constructor
 Can use the List.Capacity property to specify
 Add() method is used to add an item
 Items accessible via an ordinal index
// Create a List of integers
List<int> myFavoriteIntegers = new List<int>();
// Create a list of strings
List<string> friendsNames = new List<string>();
Sample
// Create a List of integers
List<int> powersOf2 = new List<int>();
// Add 6 integers to the List
powersOf2.Add(1);
powersOf2.Add(2);
powersOf2.Add(4);
powersOf2.Add(8);
powersOf2.Add(16);
powersOf2.Add(32);
// Change the 2nd List item to 10
powersOf2[1] = 10;
// Compute 2^3 + 2^4
int sum = powersOf2[2] + powersOf2[3];


To find an element in an array, you must process
each element in a loop
◦ unless the array is sorted

List has
◦
◦
◦
◦
◦
◦
◦

Contains() method
IndexOf() method
BinarySearch() method
Find()
FindAll()
Sort()
ConvertAll()
Running time of the List’s operations is the same
as the standard array’s running time