This unit builds on your understanding of procedural programming techniques (in C), some functional programming ideas and basic knowledge of the fundamental data structures in computer science as discussed in COMS10002. This will help you to understand and implement key concepts and also some specific algorithms taught in this unit. This is a very hands-on, programming-intensive unit, so we recommend practising your programming skills as much as possible beforehand.

It is advisable for you to revise any programming skills you have learnt in the past and practice using them to solve simple problems. If you have no experience of programming in C, it is suggested that you study some of the material in Mike McGrath's "C Programming in Easy Steps" which provides an easy to understand introduction that will serve as a good companion to the course. If you are already a confident C programmer, you may wish to study the classic reference book by Kernigham and Ritchie. It would be a good idea to make sure you are familiar with Linux as we will be running the gcc compiler directly from the command line in this course. You may also want to install the gcc compiler on your personal laptop or desktop computer before the course starts. It is also advisable for you to revise and practice any material you may have learnt about number systems (which are important for understanding the representation of numbers in a computer), Boolean logic (which is important for understanding how the logical operators work) and mathematical induction (which is important for proving the correctness of programs). Much of this material will also be taught in the "Logic and Boolean algebra" and "Number systems and arithmetic" parts of the "Introduction to Computer Architecture" unit (weeks 1-3) and the "Logic" and "Proof" parts of the "Mathematical Methods for Computer Scientists" unit (weeks 1-7). If you want to get up to speed on functional programming, it is suggested you study "The Craft of Functional Programming" by Thompson - which clearly explains all of the material from the Haskell part of the course.

This unit assumes a complete and full understanding a mathematics covered at GCSE Advanced level or equivalent. It also assumes students have confidence and curiosity to discover and learn new forms of mathematics.

This unit builds on your understanding of sequential programming techniques and ideas discussed in COMS10001 and COMS10002. The unit provides a balanced mixture of teaching you the principles that underpin concurrency and a practical side that lets you experience both the advantages and difficulties associated with concurrent programs. Thus, this is partly a hands-on, programming-intensive unit mainly working on the XS1 platform - partly a theoretical unit that requires you to learn about key ideas and properties of concurrent systems.

This unit will expand on the Theory of Computation unit in the first year, and help prepare students for more theoretical topics in later years such as the units on cryptography.

No unit preparation text found.

No unit preparation text found.

No unit preparation text found.

This unit assumes a basic knowledge of probability theory and statistics, although we will briefly review these subjects. Some programming will be required, although the coursework will involve working in teams, so you can play to your strengths.

No unit preparation text found.

No unit preparation text found.

No unit preparation text found.

All of the coursework for this unit is based on C, so we expect you to already be a competent and confident C programmer. It will be very useful to be familiar with a Linux development environment, and to be able to drive low-level software development tools such as compilers (gcc) and debuggers (gdb) from the command line. It will also be very useful to have some familiarity with the principles of computer architectures, such as pipelining, cache system, memory hierarchies etc.

This unit assumes a basic knowledge of discrete mathematics (set theory, logic). Previous experience with declarative programming (e.g., Haskell) will be useful but isn't necessary.

This unit assumes a basic knowledge of vector spaces, probability theory and statistics, although we will briefly review key aspects of these subjects. This is in part a very hands-on, programming-intensive unit built on OpenCV which utilises C and/or C++, so we recommend practising your programming skills as much as possible beforehand.

This unit assumes a basic knowledge of linear algebra and statistics.

You should begin thinking about your project before the end of second year and over the summer before you start third year. You should also look at the website of academics in the department and think about who you would like to work with as a supervisor.
After this you should contact possible supervisor to discuss possible project ideas.
It is important that you choose and agree a project early, as past experience shows that student who leave it late to find a project are more likely to have difficulties later on.

No unit preparation text found.

No unit preparation text found.

This unit requires programming skills, basic software engineering skills and a good understanding of computer architecture. We will be verifying hardware designs (written in a Hardware Description Language, such as Verilog) in the assignments. It is useful to understand a Hardware Description Language, but not a pre-requisite, because we will be using a behavioural coding style for verification, which is very close to general purpose programming languages.

This course is a natural successor to the second year course "Data Structures and Algorithms". We will be interested in algorithms and data structures which we can prove are both correct and scalable. There will be proofs and big oh notation.
Several of the algorithms and data structures covered are randomised, i.e. they are allowed to toss coins to decide what to do next. It is natural that analysing these will require a solid understanding of basic probability. There will be a probability refresher, however we recommend that students independently brush up in advance.

No unit preparation text found.

This unit introduces a number of new theoretical, software and hardware concepts. As such a good grounding in basic mathematical concepts and a familiarity with modern programming languages, such as C, Java or Haskell are assumed. Some topics, such as networks and operating systems assume only a basic degree of mathematics and no prior knowledge is required.

No unit preparation text found.

This unit builds on Crypto A. You will benefit especially by revising the public key components of that unit (definitions and constructions for both public key encryption and signatures), as well as definitions and constructions for hash functions.

This unit is open to students who have competed the second year undergraduate unit in Human Computer Interaction.

No unit preparation text found.

This unit assumes a basic knowledge of probability theory. Familiarity with Matlab programming environment is highly recommended. This is a hands-on unit that involves working as part of a team as well as individually.

No unit preparation text found.

No unit preparation text found.

No unit preparation text found.

No unit preparation text found.

No unit preparation text found.

No unit preparation text found.

No unit preparation text found.

This unit assumes a good understanding of operating systems concepts (e.g. process and memory management), basic computer architecture knowledge (e.g. instruction sets), a good understanding of networking (the TCP/IP stack and fundamentals of IP network configuration), working knowledge of the UNIX OS and C programming.

No unit preparation text found.

No unit preparation text found.

No unit preparation text found.

This unit assumes a basic knowledge of probability theory. Familiarity with Matlab programming environment is highly recommended. This is a hands-on unit that involves working as part of a team as well as individually.

No unit preparation text found.