Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Computer Science GRE Study Guide http://www.hunterthinks.com/GRE Version 1.02 Hunter Hogan Computer Science GRE Study Guide Table of Contents Computer Science GRE Study Guide ............................................................................................................. 1 Table of Contents ....................................................................................................................................... 1 Document Organization ............................................................................................................................. 1 Comments? ................................................................................................................................................ 1 Study Guide ............................................................................................................................................... 1 I. Software Systems and Methodology – 40% ................................................................................ 1 II. Computer Organization and Architecture – 15% ........................................................................ 7 III. Theory and Mathematical Background – 40% ......................................................................10 IV. Other Topics – 5% .................................................................................................................18 Appendix ..................................................................................................................................................18 Further study ........................................................................................................................................18 Greek letters .........................................................................................................................................18 Mathematics .........................................................................................................................................19 Index .........................................................................................................................................................20 Begging Copyright....................................................................................................................................22 Sources .....................................................................................................................................................22 Acknowledgements...................................................................................................................................22 Authority...................................................................................................................................................22 Version and Updates ................................................................................. Error! Bookmark not defined. Document Organization I have organized the information using the topics listed on the insert dated July 2003 that comes with the test registration booklet. The website lists slightly different topics. http://www.gre.com/subdesc.html#compsci I refer to the practice test and its instructions on multiple occasions. I highly encourage you to have a copy of the practice test available. ftp://ftp.ets.org/pub/gre/15255.pdf A few topics that do not fit into this hierarchy are appended (e.g. Greek letters). Bolded items are in place to allow you to skim the study guide. I have not had time to bold everything that I think is important. Some topics are presented in a less than ideal order. For example, we talk about NP-completeness and reference Turing machines before we explain what a Turing machine is. I do not plan to cross-reference the sections. I suggest using the index or find feature. You may find the index at the end useful. On the other hand, I stopped adding new entries to the index recently. I suspect that it includes 90% of all terms. Comments? Please send me your comments. [email protected] Study Guide I. Software Systems and Methodology – 40% A. Data organization 1. Data types Page 1 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE a. 2. Version 1.02 Hunter Hogan Definition: Data types are assigned to blocks of information. The type tells the program how to handle the specific information. For example, an integer data type can be multiplied, but a Boolean data type cannot. b. In C, we have a data type called a struct that allows us to create records with fields. Declare a struct variable using the form struct node { int age; char gender;} To access a field in the record use the form “node->age;”. c. A pointer is an unusual type. The value that it holds is a memory address. We then use the memory address to manipulate the data held at that memory address. In Pascal, to declare a pointer use: type Link = type-name; If you want to manipulate the memory address, then use the before the variable name. For example, H means, “points to H”. If you want to manipulate the data, then use the after the variable name. So, H means “H points at this data”. Remember that we read English left to right; this might help you remember what the operator does in which position. In C, to declare a pointer, use the * operator: int *p;. To store the address of a variable v in the pointer p use the statement p = &v; The ampersand (&) is the operator that returns the address instead of the value. Finally, to store a value in the pointer use the * operator again; for example, *p = v; will store the value of v at the location of p. Data structures and implementation techniques a. Definition: A data structure is a way of organizing one or more data types into groups. For example, many languages do not have a string data type. To manipulate a string, you actually create a data structure that organizes multiple character data types into one string data type. b. There are times when we place items somewhere and then retrieve them later. If you always retrieve the first item you stored then we call it First-in/First-out or FIFO. If you always retrieve the last item stored, then we call it Last-in/First-out or LIFO. c. A linked list is a simple data structure that uses cells (or elements). Each cell has at least two data fields. At least one field holds the information that you want stored in the list. The other field holds a pointer to the next cell. We often call this simple linked list a singly linked list. A doubly linked list has two pointers - one pointer points to the next cell, the other points to the previous cell. If the last cell points to the first cell, then we call it a circularly linked list. Interesting and important properties of lists include: i. You cannot move backwards on a singly linked list ii. In a singly linked list, to see any given cell you must move through all previous cells iii. The first and last cells present unique problems and you must deal with them to avoid errors. d. In Pascal, we declare linked lists like this: type Link = Cell; Cell = record Info : integer; Next : Link end; The Link type is a pointer. The Cell is a record that has two parts - an information field and a pointer (field) to the next cell. To use linked lists, use the rules for pointers. If the list is sorted, then we call it a sorted list. e. We use a hash table to store elements so that we can search them in a constant average time. We do not sort hash tables like binary search trees. The table consists of an array of locations. To store an element, we hash the value of the element using a hash function. f. Hash functions use some property of the element to figure out where to store it in the hash table. For example, we could take the numerical value of the element (remember that all data in a computer is ultimately a binary number) and divide by the size of the table (the number of locations in the array). We then discard the dividend and keep the remainder as the result (also called modulo). We also may hash on the memory address of the element. Page 2 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE g. Version 1.02 Hunter Hogan When programming hash functions, remember that strings are very large numbers and will likely overflow at the modulo operator. You must take care to use a function and execution order that will produce valid and distributed results. The result of the hash function is an index to our array. We place the element in that location (i.e. Array[hash index value]). It is possible that more than one element will hash to the same location (a collision). To avoid this, we try to make the hash table sufficiently large. When two values do hash to the same location, we have many choices. The easiest choice is to place the second element in the next available space (linear probing). Quadratic probing is more complicated and yields better results by distributing the elements into more unique locations. h. Data structures that are dynamically allocated memory (e.g. linked lists) are given memory from the heap. From time-to-time, the memory area referenced by the pointer will become unreachable. When this happens, we would like the memory to be deallocated, but we have no way to make that happen (i.e. with code). The process of garbage collection is run by the system to deallocate this memory. i. Binary trees are hierarchal graphs that have exactly one root and no more than two branches per node. The height or depth of a tree is the number of nodes from the root to the leaf that is farthest away. The breadth of the tree refers to dealing with the nodes that are the same distance from the root. The top level of the tree is considered level 0. The maximum number of nodes you can have at level n is 2n. j. If a node has no sub nodes, then we call it a leaf. k. A strictly binary tree is a tree where all non-leaf nodes have two sub nodes. l. A complete binary tree is a strictly binary tree of height h where all of the leaf nodes are at level h. m. A binary tree is a binary search tree if all of the keys (values of the nodes) on the left side of a node are less than the node and all of the keys on the right side of the node are greater than the node. n. Three common methods for traversing the nodes of the tree are preorder, inorder, and postorder. The practice test lists the precise order of traversal for each in the instructions. It is useful to recognize that inorder traversal will properly order the values for a binary search tree. Preorder traversal starts at the top and ends in the lower right. Postorder traversal starts in the lower left and ends at the top. o. A balanced binary search tree is a search tree that has a maximum height of log n, where n is the number of nodes in the tree. p. An AVL tree is a balanced binary tree with an additional rule. From any node, the height of the left and right sub trees can differ by no more than 1. q. A priority queue is any data structure that is only concerned with the highest priority item. It only provides 3 operations: insert, locate the highest priority item, and remove the highest priority item. r. Since you do not need to organize all of the elements to make a priority queue, it makes no sense to use highly ordered data structures like binary search trees. A binary heap is a tree where the highest priority node is placed at the top of the tree. You can think of this as throwing the highest priority item on the top of the heap. Without going into painful detail, it is easy to implement a tree like this using an array. The elements in the array start at the root, then the first level, then the second level, etc. When you remove the highest priority item, you do not have to reorder all of the elements, just some of them. B. Program control and structure 1. Iteration and recursion a. Definition: Iteration is the process of performing the same actions multiple times. Loops are the best examples of iteration. b. Definition: Any function that calls itself is recursive. It looks a lot like iteration, but iteration always has a way to end (i.e. a conditional check). Poorly constructed recursive functions could potentially exclude a conditional check of some sort. c. We use loops or iteration to perform the same sequence of actions repeatedly. d. There are 3 basic loops in C and Pascal: fixed repetition, pretest, and posttest. i. Fixed repetition uses the form for <assignment> to <value> do <statement>. The statement is the set of actions that the program repeats. The for/to section controls the Page 3 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE 2. 3. 1 Version 1.02 Hunter Hogan loop. Since this loop does not do any conditional check, it will repeat a fixed number of times. ii. The pretest style loop will perform a conditional check before it executes the statement. Pascal uses the form while <conditional check> do <statement>. iii. The posttest loop performs the conditional check at the end of the statement. This has a major implication: this loop will always perform one iteration. The Pascal form of the posttest loop is repeat <statement> until <conditional check>. e. Recursive functions are functions that call themselves. We use them because they are often easy to code because they translate very easily from a recursive mathematical function. There are four rules to remember when implementing recursive functions. 1 1) Always have a base case that is solved without calling itself, 2) Progress towards that base case, 3) Have faith (believe that the recursive call will work), and 4) avoid duplication of work – do not solve the same instance of a case more than once. If you leave out the base case, then you will have problems. If you break rule 4, then you will probably have an exponentially time complex algorithm. Remember that loops are sometimes more efficient and easier than recursive functions. f. Each call to a recursive function uses a process called an activation record. The major issue with having the same function called more than once is that each instance of the function needs to keep its local variables separate from the other calls. When the function is called, the activation record details certain conditions for the call. When the function ends, the computer needs to know the memory location to execute next (the return address). In a stack-based programming language, the computer keeps track of recursive calls by placing each activation record on a stack. More specifically, the stack holds pointers to each of the activation records (which hold the information about how to access the function and related non-local variables and types). g. Since recursive functions require activation records and other resources, they are usually slower than the equivalent iteration. Procedures, functions, methods, and exception handlers a. Definition: A procedure and a function are very similar animals. They both allow the programmer to call them from multiple places in the program. If the called subroutine returns a value, then we typically call it a function. b. Definition: In object-oriented programming, we have a special type of subroutine called a method. A method is defined in a class to work only on objects in that same class. c. Definition: From time-to-time, the software or hardware may want or need to change the normal execution of the program. To do this, an exception is generated. Your program or operating system must have some way to deal with the exception; the code that processes the exception is called the exception handler. d. A macro is very similar to a function or procedure. Originally, when you used a macro, the compiler literally substituted the text of the macro for the name of the macro. Therefore, if your program called the macro twice then the compiler inserted the code into the program twice. Compare this to a function call; if you call a function twice, the compiler still only inserts the code once into the program. Concurrency, communication, and synchronization a. Definition: Concurrency refers to the capability of a system to run multiple programs at the same time. This is commonly referred to as multi-tasking. This is very different from multiple processors. b. Definition: Coordinating multiple sub-routines that may pass information to each other can be a tricky task. There are many techniques for communication and synchronization. c. We often produce data with one function and then use it in another function. We say that these two functions have a producer-consumer relationship. This relationship can generate problems if they operate at different rates. To solve this, we implement a buffer. The producing function places the data in the buffer and the consuming function takes the oldest data out of the buffer. (The buffer is FIFO.) Unfortunately, the buffer itself generates new issues that we must deal with. There are four basic implementation techniques for the buffer. Weiss Page 4 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE Version 1.02 Hunter Hogan The most basic is that both functions have direct access to the buffer. This is poor design. This means that any function that produces must make sure that the buffer is not full. When it is full, there might be multiple functions waiting to place data in the buffer. Since all functions are independent of each other, there are no rules of precedence. Furthermore, it is relatively difficult to make sure that the buffer stays FIFO when both the producer and consumer could be accessing the buffer at the same time. The second way to implement the buffer is to use a semaphore. The semaphore acts as a synchronizer and does not allow simultaneous access to the buffer. Semaphores can force something called busy-waiting. Now, when the buffer is full or empty the semaphore forces the appropriate function to loop in place waiting for a change. This looping consumes processor cycles and is inefficient. Monitors are the third implementation technique. Monitors also allow only one function to have access to the buffer, but they do so in a more stringent way. The problem is that with this extra security, if one function gets control of the monitor and cannot continue (e.g. a producer function when the buffer is full), then the process has to abort and the next process is offered control. Remember that monitors suck and are inefficient. The most modern method for buffers is to make the buffer a totally separate function. With this technique, the producer does not even attempt to produce if the buffer is full and the consumer does not attempt to take something off the buffer when the buffer is empty. This is the most efficient technique we currently have. d. There are times when two (or more) functions are in deadlock. For example, imagine two functions that send information to each other, but cannot because all buffers are full. Neither function will attempt to empty a buffer, because they want to place something in a buffer. There are many ways to deal with deadlock. You could require that a process request exclusive access to the resources necessary to complete the operation before beginning the operation. If the resources are not available, the process waits. You can prioritize the resources and require that all processes request the resources in order. You can have processes time out and restart if they wait too long. You can have the operating system restart processes if the wait queues back up. C. Programming languages and notation 1. Constructs for data organization and program control a. Definition: In this section, data organization is not referring to anything like data structures. There are many ways to think about information and programming. Object-oriented programming has come to dominate the way we organize data and our programs. Older languages used imperative programming or functional programming. Prolog was a niche language that depended on a logical programming organization. The test seems to focus on imperative languages like C and Pascal, with a few questions about object-oriented design and Prolog. b. Website: A great Pascal tutorial can be found here. http://web.mit.edu/taoyue/www/tutorials/pascal/ c. Website: A decent C tutorial can be found here. http://members.tripod.com/~johnt/c.html (If you know of a better one, please email me.) 2. Scope, binding, and parameter passing a. Definition: All data and procedures in a program have a name. The scope of that name refers to which parts of the program can access the name. For example, if a variable is local to a function, then it can only be used in that function. b. Definition: When a name is attached to a specific piece of data or function then we say they are bound together. c. Definition: If you call a procedure and provide values for the called procedure to use, then we call it parameter passing. The values are the parameters. d. We use names to identify variables, types, functions, etc. Lexical scope (or static binding) is done at compile time. Dynamic Scope is done at the time the call is made to the name. e. There are three ways to pass parameters between functions (procedures). Call-by-value passes only the value of the parameter. In call-by-value, the original variable and its value become disconnected. Call-by-reference passes the memory location of the original variable. So, the new variable (in the called function) holds a memory location and not a value. The value can be changed by using the memory location appropriately. Call-by-value-result (also known as copy-in/copy-out) also changes the original variable, but it only changes the Page 5 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE Version 1.02 Hunter Hogan variable at the end of the called function. In call-by-reference, if we change the new variable, then the original variable is also changed. Call-by-name passes the name of the argument. This differs from call-by-reference, because it does not pass a memory location. Arguments to macros are a good example of call-by-name. 3. Expression evaluation a. Definition: Any set of code that returns a value when it terminates is an expression. Mathematical formulas are the best example of this (e.g. 3+4). The order of operations of a mathematical expression is an example of expression evaluation in a programming language. D. Software engineering 1. Formal specifications and assertions a. Definition: Whatever. (If you think I should put something here, email me.) 2. Verification techniques a. Definition: Whatever. (If you think I should put something here, email me.) 3. Software development models, patterns, and tools a. Definition: Whatever. (If you think I should put something here, email me.) E. Systems 1. Compilers, interpreters, and run-time systems a. Definition: Programming languages are for the convenience of the programmer, not the computer. A compiler converts the code of the programming language into either assembly language or machine code. b. Definition: It is possible to directly execute the code of a programming language without compiling it, just use an interpreter. Think of the command line in an operating system; it is often called the command interpreter because the code is executed without compiling it first. c. Definition: Most programs are designed to run in a specific operating system on a specific platform. When this is the case, the programmer (and compiler) do not have to worry about certain things like memory allocation and program startup – the run-time system will handle these and other general issues. 2. Operating systems, including resource management and protection/security a. Definition: An operating system is the software that provides an environment for other programs to run in. Through various run-time systems, applications gain access to other hardware and software resources. b. Some operating systems allow multiple users to use the computer resources at the same time (e.g. mainframes). Requiring each program to have its own memory space for each user that is executing the program is inefficient. If the program never modifies itself then we call it reentrant. Reentrant programs are more efficient because all users can use the exact same set of instructions, thereby saving memory. c. Memory-mapped I/O is a method of communicating with I/O devices using the same bus as the main memory. The alternative to using the same bus is to have a separate bus and instruction set for devices. To access one of the devices, you may need to use registers, but often the address is still the primary concept. We often say that the memory address used to access the I/O device is the I/O port. 3. Networking, Internet, and distributed systems a. Definition: If you connect multiple computers together, then we say they are networked. The Internet is the largest and most well known network. b. Definition: There are certain programs that are actually running on multiple computers at the same time. I do not mean 10,000 different people playing 10,000 different games of minesweeper. I mean 10,000 computers running what amounts to one program. The best and most well known example of this is the DNS (domain name system) service used on the Internet. Thousands of computers work together to provide what amounts to one massive program called DNS. This is an example of a distributed system. 4. Databases a. Definition: A database is a bunch of data structures in one place. We usually refer to something as a database if it organizes the data is some efficient manner and provides a way to view and update the data. 5. System analysis and development tools a. Definition: Whatever. (If you think I should put something here, email me.) Page 6 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE Version 1.02 Hunter Hogan II. Computer Organization and Architecture – 15% A. Digital logic design 1. Implementation of combination and sequential circuits a. Definition: Sequential circuits have memory, and the output depends on the input and the memory. Combinational circuits do not have memory and the output is based only on the input. b. A flip-flop (or latch) is a simple memory element that we use to store a value. The flip-flop has two inputs and one output. (One of the inputs is usually the clock.) When the clock is asserted, then you can change the stored value of the flip-flop (the latch is said to be open). 2. Optimization and analysis a. Definition: Whatever. (If you think I should put something here, email me.) B. Processors and control units 1. Instruction sets a. Definition: An instruction set is all of the machine instructions that a processor understands. b. An instruction set is all of the machine language instructions that the designers of a processor provide for computation. For a general-purpose computer, the instruction set should include instructions to perform arithmetic, logical operations, data transfers, conditional branches, and unconditional jumps. An individual instruction is literally made up of a certain number of bits in a specific order. The Intel x86 architecture has a huge set of instructions and the instructions can have variable bit lengths. Other instruction sets keep the instruction length the same for all instructions to keep the hardware simple and fast. When the processor first receives an instruction, it must first decide what type of instruction it is. This can be based on the length of the instruction and/or certain flag bits in the instruction. 2. Computer arithmetic and number representation a. Definition: Since computers use binary and cannot perform arithmetic on infinite numbers, it is important to understand the limitations and processes of a system. b. When humans write numbers, the smallest digit is the rightmost digit. Since computers do not need to represent numbers from right to left, we use the terms least significant bit and most significant bit instead. c. There are multiple methods to represent the sign of a given number. Sign and magnitude is the most obvious to use; we simply use a bit to represent positive or negative. This system has major problems; modern computers do not use it. Now imagine a computer that did not use any sign, and you try to subtract a large number from a small one. The result is that you will borrow from a string of zeros leaving a string of ones. This makes it natural to represent positive numbers with a bunch of leading zeros and negative numbers with a bunch of leading ones. We call this system two’s complement. Complementing a binary number means changing a 0 to a 1 and a 1 to a 0. d. One’s complement is not used very often. To use all negative numbers start with the positive version and then complement the entire number. This system causes some unusual problems like operating on negative zero. e. Computer addition works a lot like addition with pen and paper. The amount that is carried to the next operation is called the carry out. The amount carried from the previous operation is called the carry in. We use an end-around carry when performing some addition functions on one’s complement numbers, but not two’s complement numbers. f. If you add two positive numbers together and get a negative number, then overflow has occurred. 3. Register and ALU organization a. Definition: Registers are extremely fast memory in the processor that are used during calculations performed by the instruction set. b. Definition: The arithmetic logic unit (ALU) is the part of the processor that actually performs addition, multiplication, and Boolean operations. c. Caveat: I am weak in the area of ALU and processor architecture. I find it boring and plan to skip any questions about this on the test. I am guessing that as many as three questions will relate to an understanding of exactly how instructions are processed. I recommend you look over your computer architecture texts. 4. Data paths and control sequencing Page 7 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE a. Version 1.02 Hunter Hogan Definition: A processor has two general parts: the data path and the control. The data path moves the information around the processor and performs calculations; the control directs the actions of the data path. b. We implement job-scheduling queues at many levels in the machine. The simplest and most obvious is FIFO (first in/first out); this processes the oldest job first. LIFO is the opposite; it processes the youngest job first. Priority queuing processes the job with the highest priority first. You can also process the shortest job first. Shortest job first produces the smallest average turnaround time. Lastly, you can force the jobs to share the system resources by using round-robin. Round-robin uses an interval timer to force processing of a program to suspend and allow others to run. C. Memories and their hierarchies 1. Performance, implementation, and management a. Definition: Because fast memory is significantly more expensive that slow memory, you cannot load up your system with fast memory. So, you must have different speeds of memory. Managing that memory is a sophisticated operation. 2. Cache, main, and secondary storage a. Definition: In older systems, the processor would only talk directly to main memory. This memory was too small and lost data when it lost power, so we created secondary storage like hard drives. b. Definition: Main memory is often so slow and so large (which makes it slower to find anything), that system performance is horrible. Cache memory is smaller and faster. It helps speed up transfers between main memory and the processor. c. We use cache to speed up access to instructions and data by the processor. Cache is usually very fast, low capacity memory that is between the processor and the main physical memory. Modern processors have level 1 cache that is very small and on the same die as the processor, and level 2 cache that is in the same package as the processor but larger than the level 1 cache. Since cache cannot typically hold all of the data and instructions that we want access to, we try to make sure that the ones we will want next are in the cache. When the processor makes a memory request, it should first make sure that the requested information is not in cache. Addressing for cache is usually rather simple. Since main memory is a binary multiple of the cache memory, we can use a system called direct mapping. For example, if the address of the information in memory is 101011010101, then the address location in cache might be 0101. In this system, when we put information from memory into cache, then we only place it into the cache location that has the same ending address as the original location. Each cache location has an additional field that appends the suffix of the original memory location to what is currently stored in the cache location. The advantage to this system is processor accesses to cache are extremely fast. If the processor first had to lookup the cache location, then it would add overhead to every memory access. The disadvantage is that multiple memory locations can only be mapped to one cache location. If it impossible to have two conflicting locations in cache at the same time. So, when the processor performs a memory access, it first looks in cache. It starts by looking at the cache location that corresponds with the memory location. If the information is not in cache (a cache miss), then the information is read from memory and placed into cache. Why place it into cache? As programs execute, when a piece of data or instruction is used it is often reused very soon afterwards (think of loops). We call this temporal locality. The processor might also copy the information near the requested memory address into cache. Why copy information that has not been explicitly requested? Programs are largely linear, meaning that most programs run an instruction and then run the very next instruction (instead of jumping to a different location in the program). So, we often copy the next memory address to cache to take advantage of this spatial locality. d. An alternative to direct mapping is set-associative cache. Instead of forcing the information to only one cache location, we allow it to go to any of a set of locations. However, we still do not let the information be placed in any location at all (that is fully associative cache). Since the location of the information in cache is still related to the location of the information in physical memory, we gain a performance advantage over a fully associative cache. 3. Virtual memory, paging, and segmentation Page 8 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE a. Version 1.02 Hunter Hogan Definition: Virtual memory is secondary storage that is logically treated as main memory. Performance can be terrible, but it is often necessary to present the illusion of a very large main memory space. Since the processor cannot talk directly to secondary storage, it is necessary to move information between the main memory and the virtual memory (on the secondary storage). If you move a fixed amount of information each time, it is called paging. Segmentation allows you to move variable amounts. b. Virtual memory is the system that allows us to have memory space on secondary storage (the hard drive). In most situations, it is not possible to fit all instructions and data into physical memory. Especially, when we are running multiple programs or manipulating large data structures (databases). Virtual memory uses almost identical technology and techniques as caching. However, we have developed a different vernacular for describing virtual memory. c. We move instructions and data to the disk in units called pages. We tend to make pages large to take advantage of spatial locality (Think KB instead of bytes). When a requested page is not in main (physical) memory, and we must retrieve it from the disk (virtual memory), then we call it a page fault. Keep in mind that a disk access can take up to one million instruction cycles. This fact creates a massive penalty for page faults. d. Since page faults are very expensive, we use a fully associative paging table, we sometimes track the least recently used (LRU) pages in physical memory, and we mark unchanged pages so that we do not have to write them back to disk. e. We might also track the frequency of use of each page and page the least frequently used (LFU) pages back to disk first. In a fully associative page table system, we store the actual location for every possible virtual page. In the page table, we only store the base address of the page in memory. When a program wants to access a location in memory, it will construct the call using the virtual page and the offset from the base of that page. Look at question #18 on the practice test. The job makes the call [0, 514]. The 0 refers to the virtual page, not the actual page. The virtual memory system translates the 0 into 3 using the page table. Since each page has 1024 locations, the actual base address is 3072. Now add the offset (514). The actual address is 3586. D. Networking and communications 1. Interconnect structures (e.g. buses, switches, routers) a. Caveat: I do not have time to put any information in this section. According to people that took the test in November 2003, there are networking questions on the test. 2. I/O systems and protocols a. Caveat: I do not have time to put any information in this section. According to people that took the test in November 2003, there are networking questions on the test. 3. Synchronization a. Caveat: I do not have time to put any information in this section. According to people that took the test in November 2003, there are networking questions on the test. E. High-performance architectures 1. Pipelining superscalar and out-of-order execution processors a. Definition: If tasks must be executed in a specific order, then we say they are scalar. However, when trying to complete the same task multiple times, it may be possible to perform one step from each of the iterations at the same time. b. Most modern processors use pipelining - performing multiple instructions at the same time. 2. Parallel and distributed architectures a. Definition: Many programs lend themselves to multiple calculations being performed simultaneously. If we have multiple processors accessing the same main memory, then we tend to say they are parallel. If each processor has its own main memory, then we tend to say the system is distributed. b. It is possible and often beneficial to have multiple processors in the same computer. This parallel processing often improves throughput but it does not affect the speed of computing a single instruction. Furthermore, because certain instructions are dependent on other instructions, many functions do not benefit from the additional processors. c. Throughput is the measure of how much work is done in a certain time. We use execution time (or response time) to measure how long it takes to perform a specific instruction or set of instructions. The contrast is subtle. Think of a public laundry. The execution time measures Page 9 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE Version 1.02 Hunter Hogan how long it takes to get your dirty clothes clean and folded. The throughput is the measure of how many loads of dirty clothes were cleaned and folded in a given time. d. In a computer, designing the processor to handle multiple instructions simultaneously requires the processor to spend instruction cycles organizing the parallel processing; we call this overhead. III. Theory and Mathematical Background – 40% A. Algorithms and complexity 1. Exact and asymptotic analysis of specific algorithms a. Definition: When looking at an algorithm and evaluating it, we might want to precisely define how long it will take the program to run (exact analysis), but we usually just approximate the time (asymptotic analysis). b. The worst-case analysis of an algorithm is not the same as the upper bound. Upper bound is a property of the equations that represent the algorithm. The worst-case analysis finds the worst-case scenario and expresses the time or space to solve. On the other hand, the concepts are so closely related that we often use the terms interchangeably. c. Sorting methods i. http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html ii. Insertion sort Simple to code Good for a small number of elements Starts with one element, then inserts the next element in the correct position by scanning until the successor is found (or the end of the list) O(n2) If the information is already sorted, then it runs at O(n) iii. Shellsort Named after Donald Shell Also known as diminishing gap sort Simple to code Sorts elements that are not next to each other – this is what makes it possible to perform better than O(n2) Elements are sorted only relative to items that are k elements away. So at the 6-sort, all of the elements that are 6 away from each other are treated as a set and sorted using insertion sort The rate and method for diminishing the gap (the size of the k-sort) is important to the performance of the sort. Empirically, it appears that the best way to decrement the gap is to divide the size of the set by 2.2 Using the best known design we can get O(n5/4) iv. Merge sort Divide-and-conquer O(n log n) because of the O(n) overhead The array is divided into two sub arrays, then the first element in each array is compared (e and f), the smaller element (e) is copied to the new third sorted array. Repeat using e+1 and f until everything has been sorted. Rarely used because of the large amounts of memory and copying necessary v. Quicksort Divide-and-conquer Fastest algorithm known Average case O(n log n) Worst case O(n2) (If you choose the smallest element every time.) Uses recursion 1. If the number of elements in the set is 0 or 1, then return 2. Choose any element in the set to be a pivot 3. The remaining elements are divided into two groups: left and right 4. Perform the recursion on the two groups left and right Page 10 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE 5. 2. 3. Version 1.02 Hunter Hogan The elements are sorted into left and right based on if they are smaller or larger than the pivot The choice of pivot is important to running time – try to choose the middle element Not great for small arrays vi. Selection sort Finds the smallest item and puts it in the correct place Not efficient as it must look at all remaining items O(n2) vii. Heapsort O(n log n) Place all of the items into a heap Grab the largest one and put it in place Time efficient, but space can be a problem viii. Bubble sort Compare two items and swap if necessary; repeat through all items O(n2) But, if the list is sorted, then O(n) Algorithmic design techniques (e.g. greedy, dynamic programming, divide and conquer) a. Definition: Since we really do not know how to make algorithms, we have created artistic guidelines. b. Divide-and-conquer is an effective algorithmic technique that requires recursion. First recursively divide the problem into multiple sub-problems until you get to the base case), then add all of the sub-problems together to find the answer. c. Dynamic programming is something like being spontaneous on a tour of England. When making any decision, you do not think about what you did in the past, you only think about what you want to do right this second and what you want to do later. d. A greedy algorithm always makes the choice that is best for that moment and does not consider the future consequences. Upper and lower bounds on the complexity of specific problems a. Definition: Complexity refers to how much time or memory (space) it takes to solve a problem. b. The time complexity of an algorithm talks about how long it takes to solve problems using that algorithm. The space complexity of an algorithm talks about how much memory it takes to solve a problem using that algorithm. c. We typically measure the upper bound of time complexity with Big-O notation. d. The formal definition for Big-O notation is: given two functions f and g (that have their domain in natural numbers and their range in real numbers), then f(n) = O(g(n)) if we can find a positive integer constant c and a case of n (n0) where f(n) ≤ c (g(n)). In other words, there exists a multiple of g(n) that is greater than or equal to all f(n). Keep in mind that the constant c is not important when we express complexity (i.e. drop all constants in the expression). e. We measure the least case of time complexity with the notation f(n) = (g(n)). This means that the function f will take at least as long as some multiple of g(n). f. We measure the average case of time complexity with the notation f(n) = (g(n)). This means that, on average, the function f will take as long as some multiple of g(n). g. For space complexity, we use the same notation, but we usually explicitly let the reader know that we are talking about space complexity and not time complexity. For example, we might write something like “f(n) = O(log n) space” means that it take logarithmic space to solve the algorithm. h. Let us order different complexities. O(1) Constant time Shortest O(log n) Logarithmic time O(n) Linear Time O(n log n) n log n time O(n2) Quadratic time O(nx) Polynomial time Page 11 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE Version 1.02 Hunter Hogan O(xn) (n > 1) Exponential time O(n!) Factorial time Longest i. Imagine you have a sorted array of 1000 numbers. How would you find a specific element in that array? A sequential search of that array is an easy choice. On average, this will take (n) time. The worst case is O(n) time (to find the last element, you have to examine all elements). A binary search starts with the middle element. If the middle element is bigger than the element you are looking for, then you go to the element that is half way between the first element and the middle element. If the middle element is smaller than the element you are looking for, then you go to the element that is half way between the last element and the middle element. Repeat until you find the element you are looking for. Result: (log n) and O(log n). 4. Computational complexity, including NP-completeness a. Definition: Computability refers to whether or not a certain type of machine can solve a certain problem. b. Definition: NP-complete problems are special problems in modern computing. The name comes from the fact that you can use a Nondeterministic Polynomial-time Turing machine to solve these problems. c. If any problem can be solved in polynomial time, then it is part of the class P. All CFL are in P. The complement of a P language is also in P. d. If a problem is not known to be solvable in polynomial time, but can be verified in polynomial time, then we say it is in class NP. We say NP because we know how to make nondeterministic polynomial time Turing machines to represent the problems. e. There exist problems in NP that all other NP problems are reducible to. We say that these problems are NP-complete. Classic NP-complete problems include: i. The Hamiltonian path problem (does a directed graph have a path that travels each node exactly once?) ii. Composites (is a number a composite?) iii. Clique (does a graph have a clique of a given size?) iv. Subset-sum (given a set of numbers and target number, does the set have a subset that will add up to the target?) v. Satisfiabilty (is a given Boolean expression satisfiable?) vi. Vertex cover (given a graph, is there a set of k nodes that all edges touch?) f. The compliment of an NP language is in coNP. We do not know much about this group of languages; it is not obvious if they are different from NP. g. Other problems are not known to be in NP, but that all NP are polynomial time reducible to. We say these problems are NP-hard. B. Automata and language theory 1. Models of computation (finite automata, Turing machines) a. Definition: Before we made computers from sand, people designed models on paper that could calculate. These hypothetical machines are the basis for all modern computers. b. A deterministic finite automaton (DFA) is a model of a machine that has a finite number of states and inputs. Some DFA also have output. Question #11 in the practice test shows an output-producing DFA. The arrows between the states show the input and output of the transition between the states. The number on the left of the slash is input, the other number is output. (Memory tip: English is read left-to-right; the input happens before the output, so it is on the left.) If a set of input ends on an accept state, then we say that the machine recognizes the input. The start state is the state that the machine begins to process the input from. The set of all inputs that the machine recognizes is the language of the machine. c. A nondeterministic finite automata (NDFA) (or NFA) is a DFA that can transition to and from multiple states at one time. We can convert any NDFA into a DFA. d. A Pushdown automaton (PDA) has states and transitions like a DFA, but it also has a feature called a stack. The stack can hold information in a LIFO order. The stack allows a PDA to recognize a wider range of languages than a DFA. e. A Turing machine is the most powerful model of computation that we have discovered that actually represents a real world device. It has transitions states like a PDA or a DFA, but it uses a tape as both input and as working memory. The tape is of infinite length and can be Page 12 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE 2. 3. Version 1.02 Hunter Hogan accessed by the machine in any order. We have discovered that these two features are the key to this model’s power. Modern computers are based on the Turing machine. f. A nondeterministic Turing machine is a Turing machine that can branch into multiple states (like a NDFA). We do not know of any way to convert all nondeterministic Turing machines into Turing machines. As such, there is no real world example of a nondeterministic Turing machine. g. The Church-Turing thesis says that there are certain problems that can be solved using “effective functions.” For a function to be effective, it must be possible to solve the function in a finite number of steps with only paper and pencil. We sometimes say that this is a mechanical function. Think about calculating the first 100,000 digits of PI. It is possible for humans with paper, pencil, and the formula to accomplish this. (It would take a long time, but it is possible.) If there were not functions like this, then computers would not be possible. Unfortunately, this is more philosophy than math and cannot be proven using mathematical concepts. Formal languages and grammars (regular and context free) a. Definition: The users manual for the computational machines (see III.B.1.a) consist of the things you are allowed to do to them. To say it another way, all of the inputs you are allowed to use on a machine are said to be the machine’s language. b. We studied context free grammars (CFG) originally to describe human languages, but they are useful for understanding computer operations that need to parse (e.g. compilers). A CFG is a series of statements in the form | t. We call this statement a production. and are variables and t is terminal. Given the starting variable, the CFG parses the string until all elements have been reduced to only the terminal statements. Here is a very simple example. A -> Aa | B B -> BB | b This CFG can produce a string that has any number of “a” preceded by at least one “b”. Note that it is common to represent variables as capital letters and terminals as lower case. We also often call the first variable on the first line the start variable. c. Backus-Naur Form (BNF) is a very common metasyntax for CFGs. We enclose nonterminals in angle brackets < > (See question #12). We read the series of symbols ::= as “can be”, and the pipe symbol | as “or”. We use the normal meaning for ellipse (…); in question #12, it represents a series of letters and numbers. d. Strings are also elements of a grammar or a language. When expressing strings in languages we sometimes use regular expressions. Boolean operators are legal in regular expressions and they have the typical meaning. To concatenate two sides of an expression we can use the symbol ° or we can use the same shorthand as multiplication. For example, we can write (0 1) ° 0 or we can just use the shorthand (0 1)0. The star operator * means that we can repeat that section of the expression infinite times. For example, 0 *1 means as many zeros as we want (including none) followed by exactly one 1. We can also use it in complex situations: (0 1)*0 means any number of 0 or 1 followed by exactly one 0. e. Regular languages Context-free languages Decidable languages Recursively enumerable languages. f. A regular language is a language that can be expressed by a regular expression and recognized by a DFA. We can use the pumping lemma to prove that a language is regular. Regular languages are closed under union, concatenation, and the star operation. The compliment of any regular language is also regular. g. A Context-free language (CFL) is any language that can be expressed using a pushdown automata (PDA). h. We use a different pumping lemma to show that a language is a CFL or is not a CFL. CFL are closed under concatenation and union. The compliment of a CFL is not necessarily a CFL. Decidability a. Definition: A machine cannot solve some problems. If the machine can solve it, then we say it is decidable on that machine. b. Some problems cannot be solved by an algorithm. For example, it is impossible to create a program that will always know whether all programs will always halt on all inputs. On the other hand, some problems (languages) are decidable. Page 13 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE Version 1.02 Hunter Hogan c. d. All CFL are decidable. And some languages used on Turing machines are decidable. A language is decidable if and only if it and its complement are recursively enumerable (Turing-recognizable). e. Some important undecidable problems i. Accepting Turing machine: We cannot calculate if a certain Turing machine will accept a given input. ii. The halting problem: It is impossible to decide if a given Turing machine will halt on a certain input. iii. Empty Turing machines: It is impossible to decide if a certain Turing machine will accept any input at all. iv. DFA equivalent: It is impossible to compute if a given Turing machine has a DFA equivalent. v. Equivalent Turing machines: We cannot calculate if two Turing machines recognize equivalent languages. C. Discrete structures 1. Mathematical logic a. Definition: Mathematical logic is based on formulas that are always true or false. b. Three Americans (a scientist, a mathematician, and a logician) are traveling on a train in China. The scientist sees a green cow in the middle of a field. He says, “Wow, a green cow, the cows in China must be green.” The mathematician corrects him, “No, all we know is that there is one cow in China that is green.” The logician wakes up from his nap and corrects them both, “All we know is that there exists at least one side of one cow that is green in China.” The symbol is used to mean “there exists”. We use the symbol to mean “for all”. An example of using these symbols is n (2n). Read: For all n, there exists a number that is 2n. c. Boolean logic is based on T/F (true/false) statements. Truth tables are the most basic way to interpret Boolean functions. There are many basic operators in Boolean Operator OR (Inclusive or) AND NOT Exclusive OR (XOR) Implies Bidirectional Implication (IFF) Symbol(s) + ^ Note One, the other, both are true Both must be true Negates One or the other, not both If P then Q P if and only if Q T F T F T T T F NOT T F F T Implies T T T F F T F F AND T T T F F T F F ^ T F F F XOR T T T F F T F F F T T F IFF T T T F F T F F OR T T F F OR T T T T T F T T Page 14 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. T T F F F F T T T F T F T T T T T F T T T F F T Computer Science GRE Study Guide http://www.hunterthinks.com/GRE F F d. e. F F T F T F AND T T T T T F T F F T F T F F F F T F T F T F T F ^ T F F F F F F F XOR T T T T T F T F F T F T F F F F T F T F T F T F T F F T F T T F T T F F F F F F T T F F T F T F T F T T T F T F IFF T T T T F F F F T T F F T T F F T F T F T F T F T F F T F T T F Implies T T T T T T F F We may express all Boolean operators using other operators. Said differently, there are logical equivalents for each Boolean operator using other operators. The result is that one does not really need all of the Boolean operators to express Boolean functions. It is possible to use just a subset of the operators. Any subset of Boolean operators that can express all Boolean functions is complete. You will note that it is impossible to have a complete set of operators without including at least one negating operator. Here are some examples of logical equivalence2 i. P Q = (P Q) ii. P Q = P Q iii. P Q = (P Q) (Q P) (of course!) iv. P Q = (P Q) If you have a statement that always evaluates to true, then it is a tautology (or is valid). If you create a statement that always evaluates as false, then it is a contradiction. We say that two statements p and q are logically equivalent, written p q, if p q. If a statement has at least one way to evaluate to true, then we say it satisfiable. p ^ True p p False p p True True p ^ False False p^pp ppp ¬ (¬p) p p^qq^p 2 Version 1.02 Hunter Hogan Logical Equivalences Identity Domination Idempotent (unchanged) Double negation Commutative Sipser, p. 15 Page 15 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE 2. 3. Version 1.02 Hunter Hogan pqqp Associative p ^ (q ^ z) (p ^ q) ^ z p (q z) (p q) z Distributive p (q ^ z) (p q) ^ (p z) p ^ (q z) (p ^ q) (p ^ z) De Morgan’s Laws ¬(p ^ q) ¬p ¬q ¬(p q) ¬p ^ ¬q Absorption p (p ^ q) p p ^ (p q) p Negation p ¬p True p ^ ¬p False f. Logic gates are graphical representations of Boolean logic. The symbols are in the instructions for the test. They include graphical representations for AND, OR, XOR, NOT, NAND, and NOR. NAND is an AND followed by a NOT. NOR is an OR followed by a NOT. A circuit is a bunch of logic gates connected together. We can represent any circuit using a Boolean statement (although it may be very complex statement). Elementary combinatorics and graph theory a. Definition: Combinatorics is the study of counting and of sets. b. Definition: Graphs help us to study various types of problems. In this case, a graph is set of lines and vertices. c. Prefix notation (also called Polish notation) is a way of writing mathematical formulas that accurately show how a computer parses and executes the expression. Prefix notation does not use parentheses or rules of precedence. The order of execution is entirely dependent on the order of the expression. When evaluating a prefix expression, imagine that the values and operators of the expression are nodes in a binary tree. To evaluate the expression, traverse the tree in preorder. Alternatively, once the expression is in prefix notation, you can evaluate it by finding the rightmost operator. Evaluate the expression that uses that operator and the two values immediately to the right of the operator. For example *++234**5++6789 6 + 7 = 13 * + + 2 3 4 * * 5 + 13 8 9 13 + 8 = 21 * + + 2 3 4 * * 5 21 9 5 * 21 = 105 * + + 2 3 4 * 105 9 … d. Postfix notation (also called reverse Polish notation) traverses the tree in postorder. Alternatively, evaluate the expression starting with the leftmost operator and the two values immediately to the left of that operator. e. There are two basic rules when counting. We call the first the product rule. If a task P can be divided into two parts P1 and P2, if P1 happens x times and P2 happens y times, then the task P happens xy times. The sum rule says that if a task Q can be broken into two tasks that have no impact on each other, then Q = Q1 + Q2. f. The most basic type of graph consists of nodes (or vertices) and edges. An edge connects two nodes together. If the edges point from one node to another, then they are directed, and we say it is a directed graph. g. A clique is a graph where all of the nodes are connected directly to each other. h. A path in a graph is the set of nodes and edges you travel to get from one node to another node. i. The degree of a node is the number of edges that connect to it. Discrete probability, recurrence relations, and number theory a. Definition: Discrete means that it can be separated from other things. Digital clocks are discrete because 9 o’clock is a very specific state. Analog (face) clocks are not discrete because there is a range of states that are considered to be 9 o’clock. Page 16 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE b. c. d. e. f. g. h. i. Definition: For thousands of years, geeks and nerds all over the world have looked and found patterns in numbers. Before computers, most of these patterns had little value, so we called it number theory. Sets are unordered collections of elements. We need to know how to describe the members of the set and we need to know operators on sets. We list the members of a set B inside of a pair of braces{}. If an element is a member of the set, we write x B. If an element is not a member of the set, we write x B. If the elements of a set follow from some sort of function, then we write {x | f(x)} (read this as all x such that f(x). If two sets have the same elements, then B = D. If a set has no elements, then it is the empty set or null set written . If all of the elements in B are also in D, then B is a subset of D written B D. If B D and there is at least one element in D that is not in B, then B is a proper subset of D written B D. The power set of a given set is the set of all possible subsets of the original set. For example, the power set of {0,1} is [{}, {0}, {1}. {0,1}]. You should note that that the number of elements (which are actually subsets) in the power set with n elements is 2n. When counting the number of elements in a set, we often say it has cardinality of n if there are n elements in the set. We say sets are cardinal, because the order of the elements is not important. If the order of the elements is important, we usually call it an ordered set or a sequence. The compliment of B written B has all of the elements that are not in B, but are in the set that is made up of B and B . The union of two sets S and T, written S T is a new set that has all of the elements from S and T. The intersection of S and T, written S T is a new set that has only the elements that are in both S and T. The Cartesian product (or cross product) of A and B, written A X B is {(a, b) | a A ^ b B}. Meaning the new set has all of the ordered pairs with one element from A and one element from B. Strings are elements in a specific order. Again, we need to know how to express them and operate on them. A string that has no elements is called the empty string written or . Strings are often constructed using summation notation. Two strings S and T are concatenated, written ST, if the elements in S are followed immediately by the elements in T. Sn means that the string S has n elements; also called the length of S. T* creates a new set that includes the empty set and a bunch of new strings made up of elements from T. Each of these new strings is of varying length. We could write T * = { + T1 + T2 + T3 + …}. T+ is similar to T* except it does not include the empty set. The reversal of a string B, written BR, is the same elements but in the opposite order. A matrix is a set of numbers arranged in two dimensions. 1 2 3 0 j. Version 1.02 Hunter Hogan 4 1 0 2 0 1 1 2 We calculate the product AB of two matrices A and B by producing a new matrix that has the height of the first matrix (A) and the width of the second matrix (B). We can only perform this calculation on matrices where the first matrix’s width is equal to the second matrix’s height. Each value in the new matrix is the sum of the products of each set of values in the first matrix’s row and the second matrix’s column. For example, take two matrices A and B. 1 2 A 3 0 0 3 1 2 4 1 4 1 B 1 1 0 3 0 2 The value in the upper left hand corner of the new matrix is 1x1 + 0x1 + 4x3 = 13. The new Page 17 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE Version 1.02 Hunter Hogan matrix is 13 4 8 11 AB 4 13 8 2 k. We use the modulo (mod) operator to find the remainder of a division operation. For example, 17 mod 5 is 2. When you divide 17 by 5 you get 3 remainder 2. All by itself, this is a silly operation, but it turns out that there are many applications in things like cryptography and hash tables. So, we need to know some of the special properties of modulo arithmetic. Take two integers A and B and a positive integer M. If (A-B)/M is an integer, then we say that A is congruent to B modulo M, written A B (mod M). Furthermore, A B (mod M) A mod M = B mod M. Meaning that the remainder after dividing A/M will equal the remainder of B/M. Also, A B (mod M) A = B + kM, for some integer k. This is intuitive if you look closely. We already know that A B (mod M) (A-B)/M. There must be some multiple of M that we can add to B to get A. Just like there are an infinite set of numbers that are divisible by M, there are an infinite set of numbers that are mod M. All of the integers that are congruent to A modulo M are in the congruence class of A modulo M. We also have some very interesting properties when we deal with congruence classes. If A B (mod M) and C D (mod M), then A + C B + D (mod M) and AC BD (mod M). The multiplication of AC and BD being congruent is intuitive. Since each factor is congruent, then the product should be congruent (remember that modulo is just weird division, and that division is just multiplication having a bad-hair day). I do not consider the addition property very intuitive. You should try a couple of problems just to see that it works. Also, here is a little proof. If A B (mod M) then A = B + kM for some integer k. If C D (mod M) then C = D + jM for some integer j. Therefore, B + D = (A + kM) + (C + jM). Rearrange stuff a little and you get B + D = (A + C) + (k + j)M. Remember that A B (mod M) A = B + kM; treat B + D as the A, (A + C) as the B, and the (k + j) and the k, and you will see that A + C B + D (mod M). IV. Other Topics – 5% A. Example areas include numerical analysis, artificial intelligence, computer graphics, cryptography, security, and social issues. 1. Cryptography is the study of using encrypting information. Integer factorization has an average case time complexity that is very long. Note: Students are assumed to have mathematical background in the areas of calculus and linear algebra as applied to computer science. Appendix Further study No study guide can cover all topics. I highly recommend taking time to break down blocks of code that you have not seen before. Being able to see how a piece of code works will help you on the exam. I would also study more algorithms than I presented here. There were at least 4 algorithms on the test that I was not expecting to see. Study your math. I know I say it 3 times in this document, but those questions can be easy if you take the time to refresh your math skills. Greek letters Name Symbol Meaning Page 18 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE Alpha Beta Epsilon Lambda Theta Omicron Omega λ Version 1.02 Hunter Hogan Member of a set or an empty string Empty string Average case of complexity Worst case of complexity, usually just called Big-O Least case of complexity Mathematics 1. 2. 3. 4. 5. 6. 7. I am of the opinion that many of the questions on the sample test are really a test of mathematical skills. For example, practice questions 17, 31, and 32 do not really require computer knowledge to solve - they mostly involve mathematical skills. I recommend reviewing your discrete mathematics text as preparation for this test. There are three types of equivalence relations. a. A reflexive relation (R) on x means that xRx. b. A symmetric relation R for x and y means that xRy yRx. c. A transitive relation R for x, y and, z means that (xRy and yRz) xRz. Binary is the language and number system of the computer. Binary uses base 2 instead of Base 10. The easiest decimal numbers to represent using binary are some power of 2. Practice test question #2 requires you to realize that 0.5 = 2 -1. I highly recommend looking at this website that describes how to do basic binary counting on your fingers. http://www.johnselvia.com/binary/binary.html Furthermore, in the real world, there are certain numbers that appear regularly. It is useful to memorize this table: Power Value Description 28 256 Byte 210 1024 Kilo216 65,536 2 Bytes 220 ~1,000,000 Mega224 ~16.7 million 3 Bytes 230 ~1,000,000,000 Giga232 ~4,000,000,000 4 Bytes ! is the factorial function. The notation x! (read as x factorial) represents a number whose factors are all the integers from 1 to x. For example, 6! = 6 * 5 * 4 * 3 * 2 * 1 = 720 x is a unary function called the floor function. We apply this function to real numbers and always create an integer. It is almost like forcing the real number to round down. We will see this most often when trying to find a minimum integer value for a function. For example, log2 10 = 3 because it takes at least 23 to get to 10. x is a unary function called the ceiling function. We apply this function to real numbers and always create an integer. It is almost like forcing the real number to round up. We will see this most often when trying to find a maximum integer value for a function. For example, log2 10 = 4 because it takes at least 24 to get to 10. We often use hexadecimal (base 16) to make it easier to write long binary numbers. Base 16 converts easily to base 2 (binary). Hex Binary Decimal 0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 Page 19 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE Hex 8 9 A B C D E F Binary 1000 1001 1010 1011 1100 1101 1110 1111 Version 1.02 Hunter Hogan Decimal 8 9 10 11 12 13 14 15 Index Activation record, 5 ALU, 10 Ampersand, 2 AND, 19, 20, 21 Arithmetic logic unit, 10 Asymptotic, 13 Backus-Naur Form, 18 Balanced binary search tree, 4 Bidirectional Implication, 19 Big-O notation, 15, 25 Binary, 3, 4, 9, 10, 11, 16, 22, 25, 26 Binary heap, 4 Binary search, 3, 4, 16 Binary search tree, 3, 4 Binding, 7 BNF, 18 Boolean, 2, 10, 16, 18, 19, 20, 21 Bubble sort, 15 Busy-waiting, 6 C, 2, 4, 7, 11, 13, 15, 24, 26 Cache, 11 Cache miss, 11 Call-by-name, 7 Call-by-reference, 7 Call-by-value, 7 Call-by-value-result, 7 Cardinality, 23 Carry in, 10 Carry out, 10 Cartesian product, 23 Ceiling function, 26 Cells, 2, 3 CFG (Context free grammars), 18 CFL, 16, 18, 19 Church-Turing thesis, 17 Circularly linked list, 2 class NP, 16 Class P, 16 Collision, 3 Compliment, 10, 16, 18, 23 Concatenate, 18 Concatenated, 23 Concurrency, 5, 6 Congruence class, 24 Context free grammars, 18 Context-free language, 18 Context-free languages, 18 Contradiction, 21 Copy-in/copy-out, 7 Data path, 10 Deadlock, 6 Decidability, 18 Decidable language, 18 Deterministic finite automaton, 17 DFA, 17, 18, 19 Diminishing gap sort, 14 Direct mapped cache, 11 Doubly linked list, 2 Element, 2, 3, 9, 14, 16, 23 Elements, 2, 3, 4, 13, 14, 16, 18, 22, 23 Empty set, 23 Empty string, 23, 25 End-around carry, 10 Equivalence relations, 25 Exception, 5 Exception handler, 5 Exclusive OR, 19 Execution time, 13 FIFO, 2, 6, 10 First-in/First-out, 2 Fixed repetition loops, 4 Flip-flop, 9 Floor function, 26 Garbage collection, 3 Greek letters, 1, 25 Hash table, 3, 24 Heap, 3, 4, 15 Heapsort, 15 I/O port, 8 IFF, 19, 20 Implies, 19, 20 Inorder, 4 Insertion sort, 13, 14 Instruction set, 8, 9, 10 Intersection, 23 Iteration, 4, 5 Job scheduling, 10 Keys, 4 Page 20 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE Language, 5, 7, 8, 9, 16, 17, 18, 19, 25 Last-in/First-out, 2 Latch, 9 Least significant bit, 9 Lexical scope, 7 LIFO, 2, 10, 17 Linear probing, 3 linked list, 2 Linked list, 2, 3 Logic gates, 21 Logically equivalent, 21 Loop, 4, 5, 6, 11 Loops, 4, 5, 11 Macro, 5 Matrix, 23 Member, 23, 25 Memory-mapped I/O, 8 Merge sort, 14 Method, 5, 6, 8, 14 Mod, 24 Modulo, 3, 24 Monitors, 6 Most significant bit, 9 Multi-tasking, 6 Name, 2, 5, 7, 8, 16, 25 NAND, 21 NDFA, 17 Nodes, 3, 4, 16, 22 Nondeterministic finite automata, 17 NOR, 21 NOT, 19, 20, 21 NP, 1, 16, 17 NP-complete, 1, 16 NP-hard, 17 Null set, 23 o, 2, 3, 4, 5, 7, 11, 18, 22 O, 2, 3, 4, 5, 7, 8, 11, 12, 14, 15, 16, 18, 22, 25 Offset, 12 OR, 19, 20, 21 Overflow, 3, 10 Overhead, 11, 13, 14 P, 16, 19, 21, 22 Page, 12, 29 Page fault, 12 Paging tables, 12 Parallel processing, 13 Parameter passing, 7 Pascal, 2, 3, 4, 7 PDA, 17, 18 Pipelining, 13 Pointer, 2, 3, 5 Polish notation, 22 Postfix notation, 22 Postorder, 4, 22 Posttest loops, 4 Power set, 23 Version 1.02 Hunter Hogan Prefix notation, 22 Preorder, 4, 22 Pretest loops, 4 Priority queue, 4 Priority queuing, 10 Producer-consumer relationship, 6 Product rule, 22 Production, 18 Proper subset, 23 Pumping lemma, 18 pushdown automata, 18 Quadratic probing, 3 Quicksort, 14 Recognizes, 17 Recursive functions, 4, 5 Recursively enumerable, 18 Reentrant, 8 Reflexive relation, 25 Regular expressions, 18 Regular language, 18 Return address, 5 Round-robin, 10 Satisfiable, 16, 21 Scope, 7 Selection sort, 14 Semaphore, 6 Sequential search, 16 Sets, 9, 21, 22, 23 Shellsort, 14 Shortest job first, 10 Sign and magnitude, 9 Singly linked list, 2 Sorted list, 3 Space complexity, 15 Spatial locality, 11, 12 Star operator, 18 State, 17, 22 String, 18, 23 Strings, 3, 18, 23 Subset, 16, 21, 23 Sum rule, 22 Symmetric relation, 25 Tautology, 21 Temporal locality, 11 Terminal, 18 Throughput, 13 Time complexity, 15, 16, 24 Transitive relation, 25 Turing-recognizable language, 18 Union, 18, 23 Valid, 3, 21 Variables, 5, 7, 18 Virtual memory, 11, 12 XOR, 19, 20, 21 Youngest job first, 10 Page 21 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document. Computer Science GRE Study Guide http://www.hunterthinks.com/GRE Version 1.02 Hunter Hogan Begging Copyright No one has to pay to use this for his or her own personal use. You cannot resell this or use it to teach a class without buying it from me. If you reprint any part of this, please provide a citation and a link to my website. Finally, if you find this study guide useful, I encourage you to donate $3 to me. http://www.amazon.com/paypage/P3FXTGMULEY7KP or take a look on my website for the donation box. All other rights are reserved. Sources For each question in the practice exam (ftp://ftp.ets.org/pub/gre/15255.pdf), I have tried to provide all of the information necessary to answer it and questions that may be like it. As of now, I have skipped instruction #13, and questions #51, #58, and #60. I have also tried to provide enough information to answer most of the questions on the old practice test. http://groups.yahoo.com/group/grecs/files/CompSci_Booklet_1999.pdf (You may have to join the yahoo group.) I did skip #24, #30, #31, #32, and #35. Some books that I have read and used for reference: 1. Introduction to the Theory of Computation by Michael Sipser, 1997 PWS Publishing Company 2. Discrete Mathematics and it Applications, 5th edition by Kenneth H. Rosen, 2003 McGraw Hill 3. Computer Organization and Design, 2nd edition by Hennessy and Patterson, 1998 Morgan Kaufmann Publishers, Inc 4. Programming Languages, 2nd edition by Ravi Sethi, 1996 Addison-Wesley 5. Data Structures and Problem Solving using JAVA, 2nd edition by Mark Allen Weiss, 2002 Addison-Wesley Acknowledgements 1. 2. 3. 4. 5. 6. 7. 8. 9. Thanks to Jack for being the first to subscribe to the email list. Thanks to Kristi for her support. Thank you to the person that donated $20 (wow!) to help me pay for the website. Thanks to Xin for sending the first email comments. Thanks to Richard Conlan for many great suggestions. Thanks to Joni Laserson for your suggestion. Thanks to Wood for his many great suggestions. Thanks to everyone that has donated any amount. Thanks to Matt Minerd for the correction in my CFG example. Authority I am not an authority on computer science; I am a student. However, I do have experience in the computer industry and experience as an educator of computer concepts. My credentials include MCSE, MCSA, A+, Network+, 2 years of teaching those certifications, and many years in technical support, web design, and general debauchery. However, if your professor and this document disagree, I suggest you believe your professor. I did not do as well on the exam as I had hoped. I took the exam December 2003. Out of 70 questions, they discarded 2. Of the remaining 68, I got 34 correct, 28 incorrect, and omitted 5. My formula score was a 27. The scaled score was a 730. That amounted to the 51 st percentile. Overall, that score was good enough to meet my goals. I was not taking the exam to get into graduate school; I was taking the exam in lieu of taking the classes. The college I attended (Excelsior College) gave me 24 credit hours for my score on the GRE. I have only taken 1 computer science course (C programming in Fall 1992). I think that most people that have taken the classes could use this study guide to get 60% or better. Page 22 of 22 © 2004 Hunter Hogan. Usage rights are detailed in this document.