**Homework:** I should have given some last time.
It is listed in the notes (search for homework). Also some will be
listed this time. **BUT**, due to the Jewish holiday,
none is officially assigned. You can get started if you wish since
all will eventually be assigned, but none will be collected next class.

Now we are going to be less precise and worry only about approximate answers for large inputs.

Big-OhNotation

**Definition**: Let f(n) and g(n) be real-valued
functions of a single non-negative integer argument.
We write `f(n)` is `O(g(n))` if there is a positive real
number `c` and a positive integer `n _{0}`
such that

What does this mean?

For large inputs (`n≤n _{0}`),

Examples to do on the board

`3n-6`is`O(n)`. Some less common ways of saying the same thing follow.`3x-6`is`O(x)`.- If
`f(y)=3y-6`and`id(y)=y`, then`f(y)`is`O(id(y))`. `3n-6`is`O(2n)``9n`is^{4}+12n^{2}+1234`O(n`.^{4})`innerProduct`is`O(n)``innerProductBetter`is`O(n)``innerProductFixed`is`O(n)``countPositives`is`O(n)``n+log(n)`is`O(n)`.`log(n)+5log(log(n))`is`O(log(n))`.`12345`is^{54321}`O(1)`.`3/n`is`O(1)`. True but not the best.`3/n`is`O(1/n)`. Much better.`innerProduct`is`O(100n+log(n)+34.5)`. True, but awful.

A few theorems give us rules that make calculating big-Oh easier.

**Theorem** (arithmetic): Let `d(n)`,
`e(n)`, `f(n)`, and `g(n)` be nonnegative
real-valued functions of a nonnegative integer argument and assume
`d(n)` is `O(f(n))` and `e(n)` is
`O(g(n))`. Then

`ad(n)`is`O(f(n))`for any nonnegative a`d(n)+e(n)`is`O(f(n)+g(n))``d(n)e(n)`is`O(f(n)g(n))`

**Theorem** (transitivity): Let `d(n)`,
`f(n)`, and `g(n)` be nonnegative real-valued functions
of a nonnegative integer argument and assume `d(n)` is
`O(f(n))` and `f(n)` is `O(g(n))`. Then
`d(n)` is `O(g(n))`.

**Theorem** (special functions): (Only `n` varies)

- If
`f(n)`is a polynomial of degree d, then`f(n)`is`O(n`.^{d}) `n`is^{x}`O(a`for any^{n})`x>0``and a>1`.`log(n`is^{x})`O(log(n))`for any`x>0``(log(n))`is^{x}`O(n`for any^{y})`x>0`and`y>0`.**Homework:**R-1.19 R-1.20

- If a function is
`O(log(n))`we call it**logarithmic**. - If a function is
`O(n)`we call it**linear**. - If a function is
`O(n`we call it^{2})**quadratic**. - If a function is
`O(n`) with^{k}`k≥1`, we call it**polynomial**. - If a function is
`O(a`with^{n})`a>1`, we call it**exponential**.

**Homework:** R-1.10 and R-1.12.

R-1.13: The outer (i) loop is done 2n times. For each outer
iteration the inner loop is done i times. Each inner iteration is a
constant number of steps so each inner loop is O(i), which is the time
for the ith iteration of the outer loop. So the entire outer loop is
σO(i) i from 0 to 2n, which is O(n^{2}).

Relativesof the Big-Oh

Recall that f(n) is (g(n)) if for large n, f is not much smaller
than g. That is g is some sort of **upper** bound on f.
How about a definition for the case when g is (in the same sense) a
**lower** bound for f?

**Definition**: Let f(n) and g(n) be real valued
functions of an integer value. Then **f(n) is
Ω(g(n))** if g(n) is O(f(n)).

**Remarks**:

- We pronounce f(n) is Ω(g(n)) as "f(n) is big-Omega of g(n)".
- What the last definition says is that we say f(n) is not much smaller than g(n) if g(n) is not much bigger than f(n), which sounds reasonable to me.
- What if f(n) and g(n) are about equal, i.e., neither is much bigger than the other?

**Definition**: We write
**f(n) is Θ(g(n))** if **both**
f(n) is O(g(n)) **and** f(n) is Θ(g(n)).

**Remarks**
We pronounce f(n) is Θ(g(n)) as "f(n) is big-Theta of g(n)"

Examples to do on the board.

- 2x
^{2}+3x is θ(x^{2}). - 2x
^{3}+3x is**not**θ(x^{2}). - 2x
^{3}+3x is Ω(x^{2}). - innerProductRecutsive is Θ(n).
- binarySearch is Θ(log(n)). Unofficial for now.
- If f(n) is Θ(g(n)), the f(n) is &Omega(g(n)).
- If f(n) is Θ(g(n)), then f(n) is O(g(n)).

**Homework:** R-1.6

Recall that big-Oh captures the idea that for large n, f(n) is not much bigger than g(n). Now we want to capture the idea that, for large n, f(n) is tiny compared to g(n).

If you remember limits from calculus, what we want is that f(n)/g(n)→0 as n→∞. However, the definition we give does not use limits (it essentially has the definition of a limit built in).

**Definition**: Let f(n) and g(n) be real valued
functions of an integer variable. We say
**f(n) is o(g(n))**
if for **any** c>0,
there is an n_{0} such that
f(n)≤g(n) for all n>n_{0}.
This is pronounced as "f(n) is little-oh of g(n)".

**Definition**: Let f(n) and g(n) be real valued
functions of an integer variable. We say
**f(n) is ω(g(n)** if
g(n) is o(f(n)). This is pronounced as "f(n) is little-omega of g(n)".

**Examples**: log(n) is o(n) and x^{2} is
ω(nlog(n)).

**Homework:** R-1.4. R-1.22