 Hello everyone. So this is our final search algorithm video and it's kind of a neat one we're going to talk about binary search in this video and Binary search is pretty different. It is Certainly vastly different than sequential search and if this is you know only your second programming class It's a pretty clever algorithm and sort of unique in how it solves the problem of searching Let's start just with a very high-level overview of what we're going to do and We're going to use Mario to help illustrate the point right so what I want you to do here at the beginning is just kind of get a broad sense for the Strategy of this algorithm like what's it going to do? Okay, so we are searching a list of elements like usual And suppose that these you know question mark blocks that Mario is faced with are the list in question Now Mario is your algorithm. He's your computer He has no idea where the thing is what he is looking for is the mushroom that is in one of these blocks, right? So the question is what is the fastest way for him to kind of isolate where the mushroom is Well in binary search He employs a slightly different strategy. He could go block by block and just kind of check each one But with binary search, he's going to take advantage of the list itself To get a little more information about where the mushroom might be so what he will do is he's going to jump to the middle first Okay, and when he gets to the middle he finds out that hey the mushroom is not in that block You know over to the left. It's definitely not there. The list kind of gives him that information Okay, how does it do it? Well? Explain it here in a second, but he knows for sure that it's not on that side, right? It could be on the right side It may not be on the right side It is possible that the mushroom is not here anywhere, but he has learned that it is definitely not on that left-hand side Okay, so now where is he going to jump next time? Well, his goal is to eliminate as many Possible locations as he can at one time because he wants to reduce the number of blocks He has to search through well if when he jumps again He jumps to the middle of this right-hand side and when he jumps to the middle he learns that you know this Approximately half of the blocks Don't have it. Okay. It's just something he learns by jumping So the first time he learned that the block the mushroom couldn't be in this half So he jumped over here and then he learned well it can't be in this half of this part And so where does he jump now? Well again? He's trying to eliminate as many things as possible at one time so he jumps to the middle and By luck he kind of finds the the mushroom that he's looking for now. He didn't Uncover or he didn't examine each and every block instead. He took a big jump and figured out hey The mushroom is not in this part. It must be up here But this is how kind of binary search's strategy works He is trying to chop down and what binary search does is it chops down the amount of items you have to Search in half and then in half again and then in half again Until you eventually either find the thing or you determine that the thing is not in the list Okay So binary search what is required to make binary search work? Well, what we said was that Mario was able to get some information out of the list The way that he gets information out of the list when you code this is that you have to have the items be Sorted just like in the smart sequential search If the items are sorted you can make certain claims for example when you jump to the middle of the list you know Then in a sorted list everything to the right of where you jumped is bigger than the item where you jumped and The item everything to the left of the list where you jumped is Smaller than the place where you jumped so you can use that information kind of decide Hey, where if this thing exists in the list? Which way do I need to go? Do I need to go left or do I need to go right? We'll go through a concrete example here in just a minute Binary search is only useful if we have random access in big O of one time. So what does that mean? When we talked about the array-based list we said you could access any element by its index like my list sub 45 in big O of one time Because of the way that array-based arithmetic works. It's big O of one time For your linked list that you've now implemented you cannot randomly access an Element of the list in big O of one time It's big O of n because you can't just jump there through math You have to start at the head and walk your way down to the item kind of like you have to do in pop You start at the head and you walk your way a number of times. So binary search only works in an array context So for a linked list you're kind of stuck using a sequential search binary search is How you look for a name in a phone book or a definition in the dictionary? You don't know exactly where the thing is in the book But if you like open it to the middle, you're like, oh, I'm at You know letter K in the alphabet or letter L in the alphabet. I'm looking for the definition of Frankfurter. Okay. Well f comes before L Let me go halfway in between the beginning of the book in the middle of the book. Am I in the f's yet? Maybe yes, maybe no, and you just can't it I'm really efficient strategies It just kind of keeps splitting them in half. Okay, we call this approach of Shrinking the problem right because that's really what you're doing You're shrinking how many items you have to search by cutting them in half each time right If the value is higher than the midpoint you only have to search the top half of the list This is called a divide and conquer strategy make the problem smaller It's a strategy that appears a lot in computer science And this is maybe the first example that you have encountered of a divide and conquer algorithm Okay, so here is the algorithm itself. This is on your search handout Note here the first pre precondition to this algorithm you have a list of objects and The elements from zero to n minus one are in ascending order. So we have a sorted list, right? Here's the algorithm. It's got it's a little more complex It's still driven by a while loop and it's got some if else inside But it's it's actually not that bad if you step through it slowly. So what do we do? How does this work? again, I'm gonna give you a you know, just kind of Wrap your head around conceptually how it works. Don't worry about these details over here Just yet. We will work through a concrete example in a second Suppose we've got a 10 element array based list here, right? This says and these elements are sorted, okay from smallest to largest Suppose we're searching for 23 The essence of the binary search algorithm here. We just kind of scoot over to the side It's gonna chop down the space where it has to start where it has to search So initially it says all right. How big is the space? Well the first Index of my search space is the first element when I start in the last index I'm looking at these two variables here first and last I'm gonna set first here and last here because I need to search the whole list now We get into our while loop and our while loop is what's gonna do the jumping of Mario or the chopping down of the search space and Instead of Mario, we have a variable called mid Okay, we set mid equal to first plus last Divided by two the integer value you get out of that so the mid Index is again somewhere in the middle of your search space somewhere directly in between near the middle of The first and the last okay, so when we start this okay the first iteration of this loop We're searching the whole list So our low and our first end is here our high end is here and the middle is this guy right here Zero this is index zero. This is index nine zero plus nine is nine divided by two is Four four and a half, but we're only taking the integer so index four is right here So this blue square is the mid okay now we ask the question is the value at the middle less than Greater than or equal to the thing. We're looking for okay. We're looking for 23 so Given that this value the middle value is less than 23 and Given that this list is sorted Where must 23 be in this list? It must be above 16 somewhere right now we look at the list We see where it is the computer doesn't know where it is when the sovereign is running But the computer does know that if 16 or if 23 is in this list. It must be up here somewhere Right, so what it because the list is sorted So then what we do is we shrink the search space by moving this guy up here So we know for sure that 23 can't be down here So we're going to shrink our search space, so we're only looking in this range right here Okay, we take the middle point of this range, which is 56 and we asked the question again is Is this 23? Well, no, it's not. Okay. Is it less than or greater than 23 or 23 is less But excuse me is 23 less than or greater than 56. It's less than so what do we do? We move the high end. We're going to shrink our search space again We know it's not up here. So let's move this high end down here Okay, and we do All right, we're gonna loop back again. Now our search space is really small. We only need to search these two items So we jump to the middle of these two items and that index is 23 Aha, that is our target value. And so we have found it if it's equal You know if the middle is equal to the target value that we're looking for we're looking for 23 Then we found it. We got it binary search worked But notice, you know, how many steps we did we did one comparison two comparisons three comparisons, right? Not very many, right? And if we get this in a much bigger list like a hundred or a thousand or ten thousand or four hundred million It turns out that the number of jumps we have to do is pretty small regardless of how big the list is Okay, so let's do this algorithm by hand Again, I would normally be doing this on the board or on a sheet of paper, but I don't have it so we're gonna trace this algorithm and Going back to page three of your handout. I'm gonna trace it on this Array-based list here and we're gonna look for these values again All right, and we're gonna walk through each one of these in turn now It's gonna be a little tedious. It's okay if you think you know it, but you must you must know this algorithm Okay, this is really just one of those quintessential algorithms. It's not overly complicated, but it's got a neat concept This is something that you will get asked about on many job interview questions, right? You got to know how this thing works It's really clever and it's also the strategy this divide and conquer approach in the way that this algorithm works It's the basis for a lot of other algorithms. You will encounter in your upper-level computing classes, okay? So Understand it conceptually first and then be able to trace the algorithm itself. So let's trace the algorithm itself All right, so we are gonna look for 332 in this list now remember for binary search to work our list must be sorted and we can only do this on an Array-based list because we have to get to the index fast if we can't get to it in constant time There's no benefit to binary search. You might as well just use sequential search In fact binary search would be worse than sequential search on a linked list. Yeah, that's not good all right, so What do we do here? We're looking for 332. Let's trace our algorithm a is the list of objects sorted in ascending order and Is the number of elements in a so how many elements are there here? There are eight in our example Whoops get this here. There we go We're gonna look for our target. So let's start out by looking for 332 and we set found equal to false All right now these variables here first last and mid These are the ones that do the work before we just had kind of like this Location variable that was doing the work now. We've got three variables that are doing the work We set first equal to zero according to our algorithm. We set last equal to n minus one which is seven and We set all right now we go into our loop This is the control loop that tells us when to stop searching when to stop Jumping around the list when to stop narrowing that search space While first is less than or equal to last first and last Oh, sorry, let me move this here. So last is Gonna be up here now right first is here last is here According to the algorithm, so we'll do it visually and we'll do it with the variable values while first is less than last it is less than or equal to last excuse me and Not found. Okay. We haven't found anything yet. Set the middle equal to first plus last Zero plus seven divided by two. Okay zero plus seven divided by two is three and a half But we're taking integer division here. So we're gonna set mid equal to three Okay So that's zero plus seven divided by two. All right, that's what we're doing right here three All right Now we've jumped to the middle now. We ask our question that lets us narrow down the search space is The target we're looking for 3 3 2 here less than a submit No, 332 is not less than a submit. So we come down to this else statement If target is greater than a submit Well, 3 3 2 is greater than 8. Okay, so what do you do? set first equal to mid plus 1 Mid is right here. So I Set first equal to mid which is 3 plus 1 4 So I move first Right here just above Why because the algorithm knows That this list is sorted because this list is sorted it knows that 332 if it exists in the list It must be up here somewhere Okay, so I'm gonna set my search space Which is defined by first and last up here. Okay All right. So now what does it do? Else if we did this statement now we come back to our loop Notice mid hasn't moved yet. Right hasn't moved yet mid only moves at the beginning of the loop So this is our current state. We have looped back around While first is less than or equal to last it is and not found haven't found it yet Set mid equal to first plus last divided by 2 Well first is 4 or at index 4 last is 7 4 plus 7 7 is 11 divided by 2 is 5 and a half 5 by 2 is 5 and a half We're interested only in the integer part of that so mid becomes 5 Alright now we ask our question again All right, here's the we do our comparison, right? So we've done one comparison so far All right now We're gonna do another comparison where we are comparing our target to this item is Our target less than this item. No is our target 3 3 2 greater than this item. Why yes, it is So what do we do? We set if the target is greater than the middle item we set first greater equal to mid plus 1 Okay, and We loop back around Okay, first and last are pretty close notice that last hasn't moved yet. Right last hasn't moved yet Alright, so we loop back around first while first less than or equal to last it still is Okay, we set mid equal to first plus last divided by 2 First is 6 plus 7. That's 13 divided by 2 6 and a half Okay All right, so mid is now here so it's stacked on top of first or below first First and mid are pointing to the same thing. That's okay Now ask our question is the target 3 3 2 less than a sub mid Nope. Nope. It's not okay target is greater than a sub mid. Yes, it is so we set first Equal to mid plus 1 Alright, we're all stacked up here again Okay So now first is equal to last and mid is one behind it We loop back around now check our while loop again is First oops, sorry, and we did another comparison. So we've done three comparisons so far is First less than or equal to last Yes 7 is less than or equal to 7 Okay, first and last and mid are all indexes in this list. Okay, not the value in the list itself Set mid equal to first plus last divided by 2 7 plus 7 is 14 divided by 2 is 7 Alright, so we set mid equal to 7. So now we're all stacked up here getting kind of hairy getting kind of busy I'll move this guy down just a little bit Alright, so everybody's there Well, now, you know what's gonna happen, right? If target is less than mid a sub mid It's not less than it 3 3 2 is not less than 3 3 2 3 3 2 is not greater than 3 3 2 So it must be equal to if it's not less than and it's not greater than it must be equal to so We set found equal to true at this point Okay All right now what we exit our loop and come back up While first is less than equal to last it actually still is right and not found ah, but we have found it So we break out of our loop. We're done. Jump down here if not found Set mid equal to none. Well, we did find right found is true. So this will not execute and So we return mid. Okay, so in the case of this binary search We are returning the index where the item lives at. Okay, so and 3 3 2 does in fact live at Slot 7 we also did one more comparison here because we compared the target to this value So all in all we have done four comparisons here to get 3 3 2 right whoo, okay, so let's Do another example again. It's really important that you understand how this code works We'll try and go a little bit faster this time. So we start out Let's reset everything now. We're gonna look for 91. Okay We're gonna reset found to false We start with first equal to zero and last equal to n minus one All right, and now we set mid mid equal to first plus last divided by 2 So first plus last divided by 2 that's 7 divided by 2 which is 3 Okay, so mid is 3 at this point and we ask our question. We're looking for 91 Right, let's maybe skip over the details and let's just focus on moving these markers here Okay, and working in the visual list is mid is a Submit is 8 less than or excuse me. It's the target 91 less than 8 No Okay, is the target greater than 8. Well, 91 is greater than 8. Okay, so we set first Equal to mid plus one. Okay, so we are gonna we are moving these guys around The middle variable according to what we learned by comparing the target to this value to the value pointed at by the middle variable Okay, so we bump up first Again, and we've done one comparison But we still haven't found it yet and first is still less than last so we need the loop again Okay, so we're gonna set mid equal to 4 plus 7 first plus last divided by 2 4 plus 7 is 11 divided by 2 is 5 Okay, so mid goes here and we ask our question again. We do a comparison So this is our second comparison is our target 91 91 is our target right is our target less than a submit Why yes, it is it is 91 is less than a submit which is 1 2 3 So what do we do if the target is less than a submit you move? last One behind one to the left of mid Last gets mid minus one Okay, mid minus one is four because mid is here, right? Mid first and last hold indexes of the array not the value that's at the index, okay? Important point to keep in mind Alright, so we loop back again We're notice that in this loop We are either moving first or last or we found it Okay, so that's what the loop does well We got to move the mid to but we're moving the mid the first or the last or we found it All right, so we loop around again while first less than or equal to last it is equal and Not found we haven't found it set mid equal to first plus last divided by 2 well First is for last is for mid is going to be 8 divided by 2 which is also for so right here Okay, so we are kind of all together now all together and happy now do the comparison is Our target less than this Our target is this right so after one more comparison after three comparisons we have found it We found it set found equal to true right? It's there mid is there found the target So we are done. We found it. We exit out of our loop We return the index of the item, okay? All right, so let's do it one more time with 22 because it's important that you understand how this algorithm Understands when it doesn't when it knows the item is not in the list, okay? So let's reset our algorithm this time. We're going to look for 22 I'm just false. We're resetting first is slot 0 last is n minus 1 which is 7 Okay, so let's get into it. Let's do our loop first is less than last and not found We set mid equal to first plus last divided by 2 so 7 divided by 2 is 3 Okay, so mid goes here and then ask the question our target is 22 is 22 less than 8 No is 22 greater than 8. Yes, so we got a we know that we need to look above Mid we need to look in this range Up here, okay, so we've done one comparison so far, right? All right, we loop around again first less than equal last. Yep. Haven't found it. Nope time to jump Okay, first plus last is 11 4 plus 7 is 11 divided by 2 is 6 or 5 and a half So we go to Alright, so mid is 5 now and We ask our question is our target less than 1 2 3 it is Our target is less than 1 2 3 so we need to restrict. We need to move our search space 1 to the left of the mid Okay, last goes to mid minus 1 so last is now for and I forgot to update first So first and last are both in the same place now We've done one more comparison Okay Now we move around again each loop is a jump each time you jump mid. That's part of the loop, okay So we've jumped twice now All right is first less than or equal to last Yeah, so we continue with our loop. We still haven't found it. We continue inside the loop. We're gonna do a jump alright mid is First plus last divided by 2. Okay, so mid goes here 4 plus 4 divided by 2 is 4 Alright, so now everybody's all stacked up Okay, pay attention now Now we have to ask our question again in the algorithm Is target less than a sub mid Our target is 22 a sub mid is 91 Yes, the target is less than a sub mid. So what do we do? We set last equal to mid minus 1 ah Last is now moved down here Okay, so this is a strange scenario the last has crossed over the first Okay, that's what's happened. We've chopped our search space down so much that eventually we ran out of places to search We crossed all right Now we're in our loop. We've just done this block I'll sell sales. We jump up here while first less than or equal to last. Sorry. We did one more comparison here First is no longer less than or equal to last right First is greater than last So our loop terminates We come down here If not found did we find it? No false not false is true. We did not find it set mid equal to none and Return mid So we didn't find it Okay, how many comparisons did it take to tell us that the thing wasn't in there? It took three comparisons right, so kind of Cool, right Remember what kind of the worst-case scenario was with sequential search with a plain old sequential search You had to go through the whole list for binary search only had to go through three things Smart sequential search Would have been even more right because we would have had to look at one two three four five things So there's actually an improvement here for searching on For an item that doesn't exist in this list So that's how it works, right? We jump mid and we decide is the thing greater or less than where I jumped to We and then we shrink our search space by moving first or last depending on what we learned and if we find the thing If the thing is in the list eventually Mid will be at the thing we are looking for If the thing is not in the list then first and last will cross over one another and we know it can't possibly be in there That's the essence of how the binary search algorithm works Okay, so That's let's answer this question. Okay When do you know the target is not present? We know the target is not present when last is less than first that That's when they have crossed over. Let me highlight this over here They have crossed right now Given a list of size n What is the maximum number of comparisons required to determine if the target is in the list or not? Well, that's kind of a tricky question, right? Because before we have only been dealing with The number of items as well We've only our best algorithm has been big O of n, right? Because the best algorithm in the worst case would always have to look at every item in the list This one doesn't though this one does not have to look at every item in the list Because it is chopping the list Down with each jump in it. Okay, and so the question is Actually, not how many items are in the lists per se, but how many times what's the maximum number of times you have to chop Down before you either find the thing or you determine that it's not there Okay, so one way you can kind of think of this is How many times do you have to divide by two because that's what you're doing you're dividing the list in half We jump halfway between the remaining list. Okay, so what's the maximum number of times? Start with a list of four items How many times can you divide that list by two before you get either one or zero? Well four divided by two is two two divided by two is One we get to one after two divisions What about a list of size? Mmm eight Well eight divided by two is four four divided by two is two two divided by two is one Three divisions and we're down to one item. Okay? There's definitely a pattern here Okay Well if we have sixteen items Well sixteen divided by two is eight eight divided by two is four four divided by two is Two two divided by two is one four divisions with a list of sixteen items to get down To one item right because that's what we're doing we're chopping that search space in half four divisions Okay, so maybe you're picking up on a pattern what is two To the four It's sixteen What's two to the three? It's eight Right. We did four divisions to get down from sixteen items to one We do three divisions to get from eight items down to one three divisions by two etc etc so If I had a board that worked in front of me, right? We're what we have seen is that there's a power of two that's because we're dividing and covering because we are dividing by two How many times? Can you divide a number by two before you get one? Well, if you if we had there's a function a mathematical function that will tell us this and That is the logarithm log base two. Okay, how many times can we divide by two? This is a binary search is a log base two algorithm. Okay So what is the maximum number of comparisons? The exact number Depends on the data how many items are in the list and what's your target? Okay? So I can't actually give you a very precise number of comparisons here But what I will tell you is that it is big O log base two of N okay So let me kind of pretty this up a little bit and make it so This one right sometimes you see this written as big O log of N Log with LG with no script and computing typically means log base two. Okay, so log base two of N right What's the logarithm function? I refer you back to your trigonometry and calculus days But it is a log base two algorithm So let's compare this here. Okay kind of cool I think we're not going to do the algorithmic analysis to prove that in this class But it has to do with how many times can you divide N by two how many? Big items right you got a list of N items. How many times can you chop it in half until you find the thing? That's what we're doing. We're dividing by two Successively and there's a logarithmic or a power of two part of that equation. Okay, so Let's answer these questions binary search if the target is present in the list What's the best case search? Well, the best case if the target is in the list is You know, let's kind of reset our algorithm the best case Whoops would be if the target is right in our first jump, right? If it's right here if we're looking for eight we jump one time and lo and behold we have found it a Sub mid or excuse me. I keep moving the wrong Moving the wrong markers here If a sub mid is equal to the item we're looking for that's the best case scenario one comparison Okay All right now. What's the worst case if the item is in there? Well, as I mentioned before the worst case is how many times do you have to divide by two the answer there is log base two of N That's the worst case Okay, how many times you have to chop it in half to find the thing And it's going to be on that order again the exact number of comparisons is going to depend It depends on how many items are in the list exactly right because When I say it depends I mean It depends on the values in the list and it depends on the target value It only is going to change the number of comparisons by plus or minus one But it it does matter and it's based on the values of the data, so I can't give you a precise answer It also depends on how you implement the code in the order you do things in so But it's real close to log base two event Okay, actually I should put in here the floor function because that's what it really is The Wow the copy and paste is really angry with me right now Thanks, okay. Here we go. It's actually the floor function, right? So if you take log base two of say 13 you're gonna get a fraction you're you're taking the the floor of that, okay? It's on this it's in this range, right? Big O event is orders of magnitude So whether it's plus one or minus one we don't really care. It's on this order, okay? Worst case all right, so the target is not present for binary search How many comparisons do you do in the best case when the thing isn't there? well, the best case would be that You have a list where you kind of you still have to do a number of comparisons, right? and There's no way around that when the thing is not here again It depends on the size of the list But the the best case for when the item isn't on in the list is also this order log base two of n Okay, because you still have to do at least a minimum amount of jumping to figure out that the thing is not there Right and we saw that here That's the best case. I'm sorry the worst case is the same. It's also log base two of n Okay, so this is actually though a really really drastic improvement. Okay worst case and What is? Okay, so say you have a list of a billion items Okay, in the worst case of a sequential search or even a smart sequential search You have to look at a billion items. You have to do a billion comparisons. That's a lot of comparisons What is log base two of a billion? It is about 20 Okay, 20 comparisons versus a billion comparisons. That's a big old difference, right? That's a lot so binary search is Really fast like really really really fast Logarithmic algorithms are super fast compared to linear algorithms And you can see this if you plot a log chart versus a linear chart linear algorithms grow, you know Like this. I guess like this log algorithms grow very slowly. They almost look flat, right? So Log algorithms are very cool. And this is your first one. Why is it log algorithm because it's dividing by two It's chopping that search space in half every time. So this is a very cool algorithm. Know how it works All right, so let me go back to my slide and let's wrap up our discussion here Okay, so to binary search or to sequential search We just talked about how binary search has an enormous time efficiency An improvement over sequential search So but you cannot always buy in a research and you don't always want to either Sometimes you can't sort elements, right? if you've got a list with Antigers and floats and strings in it You can't sort that list because there's no way of comparing of saying. Oh, yeah Five is less than the string Bob or three point one four is less than the string UNCW you can't sort a list like that. So you have to sequential search also binary search and smart sequential search require the list to be sorted while sorting is not cheap Sorting the best sorting algorithms are n times log n algorithms, right? So they're super linear They're not great, right? They're okay, but they're not great especially for large data sets So does the cost of sorting? The list outweigh the cost Or outweigh the benefit of a binary search Well, if you've got a small list like 10 to the 3 10 to the 4,000 10,000 items Almost certainly it's not worth it to sort that list. Just do a sequential search computer so fast You're not going to see an appreciable difference The other time when sorting is not worth it is if you have to sort many times So say you've got a list that you you do have a need to search through, right? Like maybe it's a list of students Enrolled at your university and they're ordered by some sort of student ID number If that list changes a lot like new students come in old students drop out you're changing it like many times relative to the number of times you search Well, every time you change a list you have to resort it Or you have to put the item in order which can be expensive for arrays, right? We have to work with arrays here. So if your list is changing a lot that you need to search Probably the cost of keeping it sorted is not worth it. Okay However, if you have a large list and it's not going to change very often Like I don't know the number of patients in a in a hospital. Maybe that only changes A couple of times a day And you're going to be searching it many times Maybe another example would be a driver's license database that's used by the dmv or the police, right? They're not many new driver's licenses issued every day, but are they searched a whole lot? Yeah, they're searched by insurance companies by the police by fire by all sorts of people, right? So you do a ton of searches compared to sorting in frequently and how many people are in the database There's what 10 million people in north carolina ish. Maybe more than that. I'm probably off 30 million I think Yeah, it'll be expensive to sort One time, but if you search that list And you only have to search in log base 10 of 30 million or log base two 30 million is going to be in the range of 11 or 12 And you only have to do 10 or 12 comparisons every time you search that list Yeah, it's worth it. It's worth it to sort it if you're doing thousands of searches per day Okay, so there's a trade-off here. It's and then it's the trade-off of Is it worth it to sort this list to get that binary search to work or Nah, it's not worth it to sort it. Just do the linear search Okay, and we'll we will explore the costs of sorting in a later module. So that's it big video Sorry about that, but I really want you to understand binary search. Thanks for sticking with it You'll definitely see it on quizzes and exams and all sorts of good stuff and job interviews. So Um until next time, uh, I will see you then