0 Suka0 Tidak suka

20 tayangan64 halamancomputer

Apr 05, 2015

© © All Rights Reserved

DOCX, PDF, TXT atau baca online dari Scribd

computer

© All Rights Reserved

20 tayangan

computer

© All Rights Reserved

- The Woman Who Smashed Codes: A True Story of Love, Spies, and the Unlikely Heroine who Outwitted America's Enemies
- Steve Jobs
- NIV, Holy Bible, eBook
- NIV, Holy Bible, eBook, Red Letter Edition
- Hidden Figures Young Readers' Edition
- Cryptonomicon
- Make Your Mind Up: My Guide to Finding Your Own Style, Life, and Motavation!
- The Golden Notebook: A Novel
- Alibaba: The House That Jack Ma Built
- The 10X Rule: The Only Difference Between Success and Failure
- Autonomous: A Novel
- Hit Refresh: The Quest to Rediscover Microsoft's Soul and Imagine a Better Future for Everyone
- Hit Refresh: The Quest to Rediscover Microsoft's Soul and Imagine a Better Future for Everyone
- Life After Google: The Fall of Big Data and the Rise of the Blockchain Economy
- Algorithms to Live By: The Computer Science of Human Decisions
- Console Wars: Sega, Nintendo, and the Battle that Defined a Generation
- The Innovators: How a Group of Hackers, Geniuses, and Geeks Created the Digital Revolution

Anda di halaman 1dari 64

Stacks[edit]

A stack is a basic data structure that can be logically thought as linear structure represented by a

real physical stack or pile, a structure where insertion and deletion of items takes place at one end

called top of the stack. The basic concept can be illustrated by thinking of your data set as a stack of

plates or books where you can only take the top item off the stack in order to remove things from it.

This structure is used all throughout programming.

The basic implementation of a stack is also called a LIFO (Last In First Out) to demonstrate the way

it accesses data, since as we will see there are various variations of stack implementations.

There are basically three operations that can be performed on stacks . They are 1) inserting an item

into a stack (push). 2) deleting an item from the stack (pop). 3) displaying the contents of the

stack(pip).

Note:

Depending on the language and implementation the data structure may share the name with an abstract data type that support

all of the data structure characteristics.

Below are some of operations a stack data type normally supports:

Stack<item-type> Operations

push(new-item:item-type)

top():item-type

pop()

is-empty():Boolean

is-full():Boolean

get-size():Integer

All operations except get-size() can be performed in

time. get-

The basic linked list implementation is one of the easiest linked list

implementations you can do. Structurally it is a linked list.

type Stack<item_type>

data list:Singly Linked List<item_type>

constructor()

list := new Singly-Linked-List()

end constructor

underlying linked list. When you want to push something onto the list, you

simply add it to the front of the linked list. The previous top is then "next"

from the item being added and the list's front pointer points to the new item.

method push(new_item:item_type)

list.prepend(new_item)

end method

To look at the top item, you just examine the first item in the linked list.

method top():item_type

return list.get-begin().get-value()

end method

When you want to pop something off the list, simply remove the first item

from the linked list.

method pop()

list.remove-first()

end method

method is-empty():Boolean

return list.is-empty()

end method

A check for full is simple. Linked lists are considered to be limitless in size.

method is-full():Boolean

return False

end method

method get-size():Integer

return list.get-size()

end method

end type

A real Stack implementation in a published library would probably reimplement the linked list in order to squeeze the last bit of performance out

of the implementation by leaving out unneeded functionality. The above

implementation gives you the ideas involved, and any optimization you

need can be accomplished by inlining the linked list code.

Performance Analysis[edit]

operation because

the list contains a pointer that checks for empty/fullness as done here are

also

time, users of a Stack do not use the getSize() operation, and so a bit of

space can be saved by not optimizing it.

Since all operations are at the top of the stack, the array implementation is

now much, much better.

public class StackArray implements Stack

{

protected int top;

protected Object[] data;

...

}

The array implementation keeps the bottom of the stack at the beginning of

the array. It grows toward the end of the array. The only problem is if you

attempt to push an element when the array is full. If so

Assert.pre(!isFull(),"Stack is not full.");

will fail, raising an exception. Thus it makes more sense to implement with

Vector (see StackVector) to allow unbounded growth (at cost of occasional

O(n) delays).

Complexity:

All operations are O(1) with exception of occasional push and clear, which

should replace all entries by null in order to let them be garbage-collected.

Array implementation does not replace null entries. The Vector

implementation does.

Applications of Stacks[edit]

Stack of books

Using stacks, we can solve many applications, some of which are listed

below.

The logic for transforming a decimal number into a binary number is as

follows:

* Read a number

* Iteration (while number is greater than zero)

1. Find out the remainder after dividing the

number by 2

2. Print the remainder

3. Divide the number by 2

* End the iteration

However, there is a problem with this logic. Suppose the number, whose

binary form we want to find is 23. Using this logic, we get the result as

11101, instead of getting 10111.

To solve this problem, we use a stack. We make use of the LIFO property of

the stack. Initially we push the binary digit formed into the stack, instead of

printing it directly. After the entire digit has been converted into the binary

form, we pop one digit at a time from the stack and print it. Therefore we get

the decimal number is converted into its proper binary form.

Algorithm:

1. Create a stack

2. Enter a decimal number, which has to be converted

into its equivalent binary form.

3. iteration1 (while number > 0)

3.1 digit = number % 2

3.2 Push digit into the stack

3.3 If the stack is full

3.3.1 Print an error

3.3.2 Stop the algorithm

3.4 End the if condition

3.5 Divide the number by 2

4. End iteration1

5. iteration2 (while stack is not empty)

5.1 Pop digit from the stack

5.2 Print the digit

6. End iteration2

7. STOP

Towers of Hanoi[edit]

Towers of Hanoi

puzzle called Tower of Hanoi. According to an old Brahmin story, the

existence of the universe is calculated in terms of the time taken by a

number of monks, who are working all the time, to move 64 disks from one

pole to another. But there are some rules about how this should be done,

which are:

1. You can move only one disk at a time.

2. For temporary storage, a third pole may be used.

diameter.[1]

Here we assume that A is first tower, B is second tower & C is third tower.

Tower of Hanoi

Let 1 be the smallest disk, 2 be the disk of medium size and 3 be the

largest disk.

Move disk

From peg

To peg

Move disk

From peg

To peg

Move disk

From peg

To peg

The C++ code for this solution can be implemented in two ways:

First Implementation (Without using Stacks)[edit]

Here we assume that A is first tower, B is second tower & C is third tower.

(B is the intermediate)

void TowersofHanoi(int n, int a, int b, int c)

{

//Move top n disks from tower a to tower b, use

tower c for intermediate storage.

if(n > 0)

{

TowersofHanoi(n-1, a, c, b);

//recursion

cout << " Move top disk from tower " << a << "

to tower " << b << endl ;

//Move n-1 disks from intermediate(b) to the

source(a) back

TowersofHanoi(n-1, c, b, a);

//recursion

}

}

[2]

// Global variable , tower [1:3] are three towers

arrayStack<int> tower[4];

void TowerofHanoi(int n)

{

// Preprocessor for moveAndShow.

for (int d = n; d > 0; d--)

//initialize

tower[1].push(d);

//add disk d to

tower 1

moveAndShow(n, 1, 2, 3);

/*move n disks

from tower 1 to tower 3 using

tower 2 as

intermediate tower*/

}

void moveAndShow(int n, int a, int b, int c)

{

// Move the top n disks from tower a to tower b

showing states.

// Use tower c for intermediate storage.

if(n > 0)

{

moveAndShow(n-1, a, c, b);

//recursion

int d = tower[x].top();

//move a disc

from top of tower x to top of

tower[x].pop();

//tower y

tower[y].push(d);

showState();

//show state of

3 towers

moveAndShow(n-1, c, b, a);

//recursion

}

}

However complexity for above written implementations is O(

). So it's

obvious that problem can only be solved for small values of n (generally n

<= 30). In case of the monks, the number of turns taken to transfer 64

disks, by following the above rules, will be 18,446,744,073,709,551,615;

which will surely take a lot of time!!

[1]

[2]

Calculators employing reverse Polish notation use a stack structure to hold

values. Expressions can be represented in prefix, postfix or infix notations.

Conversion from one form of the expression to another form may be

accomplished using a stack. Many compilers use a stack for parsing the

syntax of expressions, program blocks etc. before translating into low level

code. Most of the programming languages are context-free

languages allowing them to be parsed with stack based machines.

Evaluation of an Infix Expression that is Fully Parenthesized[edit]

Input: (((2 * 5) - (1 * 2)) / (11 - 9))

Output: 4

Analysis: Five types of input characters

* Opening bracket

* Numbers

* Operators

* Closing bracket

* New line character

Algorithm

1. Read one input character

2. Actions at end of each input

Opening brackets

(2.1)

(2.2)

(2.3)

Number

and then Go to step (1)

Operator

and then Go to step (1)

Closing brackets

(2.4)

Pop it from

character stack

(2.4.1) if it is

opening bracket, then discard it, Go to step (1)

(2.4.2) Pop is used

three times

The first

popped element is assigned to op2

The second

popped element is assigned to op

The third

popped element is assigned to op1

Evaluate op1 op

op2

Convert the

result into character and

push into the

stack

Go to step

(2.4)

New line character

(2.5)

STOP

on the monitor as follows:

Input String: (((2 * 5) - (1 * 2)) / (11 - 9))

Input Symbol

((

(((

Operation

Input Symbol

(((2

(((2*

Operation

(((2*5

( ( 10

2 * 5 = 10 and push

( ( 10 -

( ( 10 - (

( ( 10 - ( 1

( ( 10 - ( 1 *

( ( 10 - ( 1 * 2

( ( 10 - 2

1 * 2 = 2 & Push

(8

10 - 2 = 8 & Push

(8/

(8/(

11

( 8 / ( 11

Input Symbol

Operation

( 8 / ( 11 -

( 8 / ( 11 - 9

(8/2

11 - 9 = 2 & Push

8 / 2 = 4 & Push

New line

Empty

C Program

int main (int argc, char *argv[])

{

struct ch *charactop;

struct integer *integertop;

char rd, op;

int i = 0, op1, op2;

charactop = cclearstack();

integertop = iclearstack();

while(1)

{

rd = argv[1][i++];

switch(rd)

{

case '+':

case '-':

case '/':

case '*':

case '(': charactop = cpush(charactop, rd);

break;

case ')': integertop = ipop (integertop,

&op1);

charactop = cpop (charactop,

&op);

while(op != '(')

{

integertop = ipush

(integertop, eval(op, op1, op2);

charactop = cpop (charactop,

&op);

if (op != '(')

{

integertop =

ipop(integertop, &op2);

integertop =

ipop(integertop, &op1);

}

}

break;

case '\0': while (!= cemptystack(charactop))

{

charactop = cpop(charactop,

&op);

integertop = ipop(integertop,

&op2);

integertop = ipop(integertop,

&op1);

integertop =

ipush(integertop, eval(op, op1, op2);

}

integertop = ipop(integertop,

&op1);

printf("\n The final solution is:

%d", op1);

return 0;

default: integertop = ipush(integertop, rd '0');

}

}

}

int eval(char op, int op1, int op2)

{

switch (op)

{

case '+': return op1 + op2;

case '-': return op1 - op2;

case '/': return op1 / op2;

case '*': return op1 * op2;

}

}

Input entered at the command line: (((2 * 5) - (1 * 2) / (11 - 9))

[3]

Input: (2 * 5 - 1 * 2) / (11 - 9)

Output: 4

Analysis: There are five types of input characters which are:

* Opening brackets

* Numbers

* Operators

* Closing brackets

* New line character (\n)

implementing the priority rule for operators, we have a solution to this

problem.

The Priority rule we should perform comparative priority check if an

operator is read, and then push it. If the stack top contains an operator of

prioirty higher than or equal to the priority of the input operator, then

we pop it and print it. We keep on perforrming the prioirty check until

the top of stack either contains an operator of lower priority or if it does not

contain an operator.

Data Structure Requirement for this problem: A character stack and an

integer stack

Algorithm:

1. Read an input character

2. Actions that will be performed at the end of each

input

Opening brackets

(2.1)

Push it into

(2.2)

Push into

(2.3)

Do the

Digit

stack, Go to step (1)

Operator

comparative priority check

(2.3.1) if the

character stack's top contains an operator with equal

or higher

priority, then pop it into op

Pop a number

from integer stack into op2

Pop another

number from integer stack into op1

Calculate op1

op op2 and push the result into the integer

stack

Closing brackets

(2.4)

character stack

(2.4.1) if it is an

opening bracket, then discard it and Go to

step (1)

(2.4.2) To op, assign

the popped element

Pop a number

from integer stack and assign it op2

Pop another

number from integer stack and assign it

to op1

Calculate op1

op op2 and push the result into the integer

stack

Convert into

character and push into stack

Go to the step

(2.4)

New line character

(2.5)

STOP

is printed as follows:

Input String: (2 * 5 - 1 * 2) / (11 - 9)

Input

Symbol

bottom to top)

(*

(*

(*

bottom to top)

Operation perform

25

do 2 * 5 = 10

(-

10

(-

10 1

(-*

10 1

(-*

10 1 2

(-

10 2

Perform 1 * 2 = 2 and

Pop - and 10 - 2 = 8 a

Pop (

/(

Input

Symbol

bottom to top)

bottom to top)

Operation perform

11

/(

8 11

/(-

8 11

/(-

8 11 9

82

Perform 11 - 9 = 2 and

Perform 8 / 2 = 4 and

New line

C Program

int main (int argc, char *argv[])

{

struct ch *charactop;

struct integer *integertop;

char rd, op;

int i = 0, op1, op2;

charactop = cclearstack();

integertop = iclearstack();

while(1)

{

rd = argv[1][i++];

switch(rd)

{

case '+':

case '-':

case '/':

case '*': while ((charactop->data != '(')

&& (!cemptystack(charactop)))

{

if(priority(rd) >

(priority(charactop->data))

break;

else

{

charactop =

cpop(charactop, &op);

integertop =

ipop(integertop, &op2);

integertop =

ipop(integertop, &op1);

integertop =

ipush(integertop, eval(op, op1, op2);

}

}

charactop = cpush(charactop, rd);

break;

case '(': charactop = cpush(charactop, rd);

break;

case ')': integertop = ipop (integertop,

&op2);

integertop = ipop (integertop,

&op1);

charactop = cpop (charactop,

&op);

while(op != '(')

{

integertop = ipush

(integertop, eval(op, op1, op2);

charactop = cpop (charactop,

&op);

if (op != '(')

{

integertop =

ipop(integertop, &op2);

integertop =

ipop(integertop, &op1);

}

}

break;

case '\0': while (!= cemptystack(charactop))

{

charactop = cpop(charactop,

&op);

integertop = ipop(integertop,

&op2);

integertop = ipop(integertop,

&op1);

integertop =

ipush(integertop, eval(op, op1, op2);

}

integertop = ipop(integertop,

&op1);

printf("\n The final solution is:

%d", op1);

return 0;

default: integertop = ipush(integertop, rd '0');

}

}

}

int eval(char op, int op1, int op2)

{

switch (op)

{

case '+': return op1 + op2;

case '-': return op1 - op2;

case '/': return op1 / op2;

case '*': return op1 * op2;

}

}

int priority (char op)

{

switch(op)

{

case '^':

case '$': return 3;

case '*':

case '/': return 2;

case '+':

case '-': return 1;

}

}

Output of the program:

Input entered at the command line: (2 * 5 - 1 * 2) / (11 - 9)

Output: 4 [3]

Input: x + 6 * ( y + z ) ^ 3

Output:' 4

Analysis: There are three types of input characters

* Numbers

* Operators

* New line character (\n)

Algorithm:

1. Read one character input at a time and keep pushing

it into the character stack until the new

line character is reached

2. Perform pop from the character stack. If the stack

is empty, go to step (3)

Number

Operator

(2.2)

Assign the

operator to op

Pop a number

from

Pop another

and assign it

to op2

Calculate op1

op op2 and push the output into the integer

stack. Go to

step (2)

3. Pop the result from the integer stack and display

the result

Input String: / - * 2 5 * 1 2 - 11 9

bottom to top)

Input Symbol

bottom to top)

/-*

/-*2

/-*25

/-*25*

/-*25*1

/-*25*12

/-*25*12-

11

/ - * 2 5 * 1 2 - 11

/ - * 2 5 * 1 2 - 11 9

\n

/ - * 2 5 * 1 2 - 11

/-*25*12-

9 11

/-*25*12

Operation

performed

11 - 9 = 2

bottom to top)

Input Symbol

bottom to top)

Operation

performed

/-*25*1

22

/-*25*

221

/-*25

22

/-*2

225

/-*

2252

/-

2 2 10

5 * 2 = 10

28

10 - 2 = 8

Stack is empty

8/2=4

Stack is empty

Print 4

C Program

int main (int argc, char *argv[])

{

struct ch *charactop = NULL;

struct integer *integertop = NULL;

char rd, op;

int i = 0, op1, op2;

charactop = cclearstack();

integertop = iclearstack();

rd = argv[1][i];

while(rd != '\0')

{

charactop = cpush(charactop, rd);

rd = argv[1][i++];

1*2=2

}

while(!emptystack(charactop))

{

charactop = cpop(charactop,

switch(rd)

{

case '+':

case '-':

case '/':

case '*':

op = rd;

integertop

ipop(integertop, &op2);

integertop

ipop(integertop, &op1);

integertop

ipush(integertop, eval(op, op1, op2));

break;

rd);

=

=

=

default:

integertop =

ipush(integertop, rd - '0');

}

}

}

int eval(char op, int op1, int op2)

{

switch (op)

{

case '+': return op1 + op2;

case '-': return op1 - op2;

case '/': return op1 / op2;

case '*': return op1 * op2;

}

}

int priority (char op)

{

switch(op)

{

case '^':

case '$': return 3;

case '*':

case '/': return 2;

case '+':

}

}

Output of the program:

Input entered at the command line: / - * 2 5 * 1 2 - 11 9

Output: 4 [3]

Conversion of an Infix expression that is fully parenthesized into a

Postfix expression[edit]

Input: (((8 + 1) - (7 - 4)) / (11 - 9))

Output: 8 1 + 7 4 - - 11 9 - /

Analysis: There are five types of input characters which are:

* Opening brackets

* Numbers

* Operators

* Closing brackets

* New line character (\n)

Algorithm:

1. Read an character input

2. Actions to be performed at end of each input

Opening brackets

(2.1)

(2.2)

(2.3)

(2.4)

Number

Go to step (1)

Operator

and then Go to step (1)

Closing brackets

stack

(2.4.1) If it is an

operator, print it, Go to step (1)

(2.4.2) If the popped

element is an opening bracket,

discard it and

go to step (1)

New line character

(2.5)

STOP

postfix expression is as follows:

Input

Operation

Stack (after

op)

Output

monito

((

(((

(2.2) Print it

(2.2) Print it

81

(((

print it

81+

((

we ignore it and read next character

81+

(((+

((-

((-(

Input

Operation

Stack (after

op)

Output

monito

(2.2) Print it

81+7

(2.2) Print it

81+74

((-(

print it

81+74-

((-(-

((we ignore it and read next character

((

print it

81+74--

(

we ignore it and read next character

(/

(/(

11

(2.2) Print it

(2.2) Print it

81+74--

81+74--

81+74--

(/(-

Input

Operation

Stack (after

op)

Output

monito

print it

(/

we ignore it and read next character

(

print it

Stack is empty

we ignore it and read next character

New line

character

(2.5) STOP

Problem Description[edit]

It's a very nice application of stacks. Consider that a freight train

has n railroad cars. Each to be left at different station. They're numbered 1

through n & freight train visits these stations in order n through 1. Obviously,

the railroad cars are labeled by their destination.To facilitate removal of the

cars from the train, we must rearrange them in ascending order of their

number(i.e. 1 through n). When cars are in this order , they can be

detached at each station. We rearrange cars at a shunting yard that

hasinput track, output track & k holding tracks between input & output

tracks(i.e. holding track).

Solution Strategy[edit]

To rearrange cars, we examine the cars on the the input from front to back.

If the car being examined is next one in the output arrangement , we move

it directly to output track. If not , we move it to the holding track & leave it

there until it's time to place it to the output track. The holding tracks

operate in a LIFO manner as the cars enter & leave these tracks from top.

When rearranging cars only following moves are permitted:

81+74--

A car may be moved from front (i.e. right end) of the input track to the

top of one of the holding tracks or to the left end of the output track.

A car may be moved from the top of holding track to left end of

the output track.

The figure shows a shunting yard with k = 3, holding tracks H1, H2 & H3,

also n = 9. The n cars of freight train begin in the input track & are to end up

in the output track in order 1 through n from right to left. The cars initially

are in the order 5,8,1,7,4,2,9,6,3 from back to front. Later cars are

rearranged in desired order.

A Three Track Example[edit]

Consider the input arrangement from figure , here we note that the car

3 is at the front, so it can't be output yet, as it to be preceded by cars 1

& 2. So car 3 is detached & moved to holding track H1.

The next car 6 can't be output & it is moved to holding track H2.

Because we have to output car 3 before car 6 & this will not possible if

we move car 6 to holding track H1.

cars should be preferred to arrange in ascending order from top to bottom.

previous statement. If we move car 2 to H2 or H3, then we've no place

to move cars 4,5,7,8.The least restrictions on future car placement

arise when the new car is moved to the holding track that has a

car at its top with smallest label such that < . We may call it

an assignment rule to decide whether a particular car belongs to a

specific holding track.

When car 4 is considered, there are three places to move the car

H1,H2,H3. The top of these tracks are 2,6,9.So using above mentioned

Assignment rule, we move car 4 to H2.

The next car 1 has the least label, so it's moved to output track.

Now it's time for car 2 & 3 to output which are from H1(in short all the

cars from H1 are appended to car 1 on output track).

The car 4 is moved to output track. No other cars can be moved to output

track at this time.

Car 5 is output from input track. Car 6 is moved to output track from H2,

so is the 7 from H3,8 from H1 & 9 from H3.

Quicksort[edit]

Sorting means arranging a group of elements in a particular order. Be it

ascending or descending, by cardinality or alphabetical order or variations

thereof. The resulting ordering possibilities will only be limited by the type of

the source elements.

Quicksort is an algorithm of the divide and conquer type. In this method, to

sort a set of numbers, we reduce it to two smaller sets, and then sort these

smaller sets.

This can be explained with the help of the following example:

Suppose A is a list of the following numbers:

In the reduction step, we find the final position of one of the numbers. In this

case, let us assume that we have to find the final position of 48, which is the

first number in the list.

To accomplish this, we adopt the following method. Begin with the last

number, and move from right to left. Compare each number with 48. If the

number is smaller than 48, we stop at that number and swap it with 48.

The numbers 96 and 72 to the right of 48, are greater than 48. Now

beginning with 24, scan the numbers in the opposite direction, that is from

left to right. Compare every number with 48 until you find a number that is

greater than 48.

In this case, it is 60. Therefore we swap 48 and 60.

Note that the numbers 12, 24 and 36 to the left of 48 are all smaller than 48.

Now, start scanning numbers from 60, in the right to left direction. As soon

as you find lesser number, swap it with 48.

In this case, it is 44. Swap it with 48. The final result is:

Now, beginning with 44, scan the list from left to right, until you find a

number greater than 48.

Such a number is 84. Swap it with 48. The final result is:

Now, beginning with 84, traverse the list from right to left, until you reach a

number lesser than 48. We do not find such a number before reaching 48.

This means that all the numbers in the list have been scanned and

compared with 48. Also, we notice that all numbers less than 48 are to the

left of it, and all numbers greater than 48, are to it's right.

The final partitions look as follows:

Therefore, 48 has been placed in it's proper position and now our task is

reduced to sorting the two partitions. This above step of creating partitions

can be repeated with every partition containing 2 or more elements. As we

can process only a single partition at a time, we should be able to keep

track of the other partitions, for future processing.

This is done by using two stacks called LOWERBOUND and

UPPERBOUND, to temporarily store these partitions. The addresses of the

first and last elements of the partitions are pushed into the LOWERBOUND

and UPPERBOUND stacks respectively. Now, the above reduction step is

applied to the partitions only after it's boundary values are popped from the

stack.

We can understand this from the following example:

Take the above list A with 12 elements. The algorithm starts by pushing the

boundary values of A, that is 1 and 12 into the LOWERBOUND and

UPPERBOUND stacks respectively. Therefore the stacks look as follows:

LOWERBOUND:

UPPERBOUND:

12

To perform the reduction step, the values of the stack top are popped from

the stack. Therefore, both the stacks become empty.

LOWERBOUND:

{empty}

UPPERBOUND:

{empty}

Now, the reduction step causes 48 to be fixed to the 5th position and

creates two partitions, one from position 1 to 4 and the other from position 6

to 12. Hence, the values 1 and 6 are pushed into the LOWERBOUND stack

and 4 and 12 are pushed into the UPPERBOUND stack.

LOWERBOUND:

1, 6

UPPERBOUND: 4, 12

For applying the reduction step again, the values at the stack top are

popped. Therefore, the values 6 and 12 are popped. Therefore the stacks

look like:

LOWERBOUND:

UPPERBOUND: 4

The reduction step is now applied to the second partition, that is from the

6th to 12th element.

After the reduction step, 98 is fixed in the 11th position. So, the second

partition has only one element. Therefore, we push the upper and lower

boundary values of the first partition onto the stack. So, the stacks are as

follows:

LOWERBOUND:

1, 6

UPPERBOUND:

4, 10

The processing proceeds in the following way and ends when the stacks do

not contain any upper and lower bounds of the partition to be processed,

and the list gets sorted.

The Stock Span Problem[edit]

In the stock span problem, we will solve a financial problem with the help of

stacks.

Suppose, for a stock, we have a series of n daily price quotes, thespan of

the stock's price on a particular day is defined as the maximum number of

consecutive days for which the price of the stock on the current day is less

than or equal to its price on that day.

An algorithm which has Quadratic Time Complexity[edit]

Input: An array P with n elements

Output: An array S of n elements such that P[i] is the largest integer k such

that k <= i + 1 and P[y] <= P[i] for j = i - k + 1,.....,i

Algorithm:

1. Initialize an array P which contains the daily

prices of the stocks

2. Initialize an array S which will store the span

of the stock

3. for i = 0 to i = n - 1

3.1 Initialize k to zero

3.2 Done with a false condition

3.3 repeat

3.3.1 if ( P[i - k] <= P[i)] then

Increment k by 1

3.3.2 else

Done with true condition

3.4 Till (k > i) or done with processing

Assign value of k to S[i] to get the

span of the stock

4. Return array S

end. This is a constant time operation, hence takesO(n) time

The repeat loop is nested within the for loop. The for loop, whose

counter is i is executed n times. The statements which are not in the

repeat loop, but in the for loop are executed n times. Therefore these

statements and the incrementing and condition testing of i take O(n)

time.

In repetition of i for the outer for loop, the body of the inner repeat loop

is executed maximum i + 1 times. In the worst case, element S[i] is

greater than all the previous elements. So, testing for the if condition,

the statement after that, as well as testing the until condition, will be

performed i + 1 times during iteration i for the outer for loop. Hence, the

total time taken by the inner loop is O(n(n + 1)/2), which is O(

The running time of all these steps is calculated by adding the time taken by

all these three steps. The first two terms are O( ) while the last term is O(

). Therefore the total running time of the algorithm is O(

).

In order to calculate the span more efficiently, we see that the span on a

particular day can be easily calculated if we know the closest day before i ,

such that the price of the stocks on that day was higher than the price of the

stocks on the present day. If there exists such a day, we can represent it by

h(i) and initialize h(i) to be -1.

Therefore the span of a particular day is given by the formula, s = i - h(i).

To implement this logic, we use a stack as an abstract data type to store the

days i, h(i), h(h(i)) and so on. When we go from day i-1 to i, we pop the

days when the price of the stock was less than or equal to p(i) and then

push the value of day i back into the stack.

Here, we assume that the stack is implemented by operations that

take O(1) that is constant time. The algorithm is as follows:

Input: An array P with n elements and an empty stack N

Output: An array S of n elements such that P[i] is the largest integer k such

that k <= i + 1 and P[y] <= P[i] for j = i - k + 1,.....,i

Algorithm:

1. Initialize an array P which contains the daily

prices of the stocks

2. Initialize an array S which will store the span

of the stock

3. for i = 0 to i = n - 1

3.1 Initialize k to zero

3.2 Done with a false condition

3.3 while not (Stack N is empty or done

with processing)

3.3.1 if ( P[i] >= P[N.top())] then

3.3.2 else

Done with true condition

3.4 if Stack N is empty

3.4.1 Initialize h to -1

3.5 else

3.5.1 Initialize stack top to h

3.5.2 Put the value of h - i in

S[i]

3.5.3 Push the value of i in N

4. Return array S

end. This is a constant time operation, hence takesO(n) time

The while loop is nested within the for loop. The for loop, whose

counter is i is executed n times. The statements which are not in the

repeat loop, but in the for loop are executed n times. Therefore these

statements and the incrementing and condition testing of i take O(n)

time.

Now, observe the inner while loop during i repetitions of the for loop.

The statement done with a true condition is done at most once, since it

causes an exit from the loop. Let us say that t(i) is the number of times

statement Pop a value from stack N is executed. So it becomes clear

that while not (Stack N is empty or done with processing) is tested

maximum t(i) + 1 times.

Adding the running time of all the operations in the while loop, we get:

into it. Therefore,

So, the running time of all the statements in the while loop is O( )

The running time of all the steps in the algorithm is calculated by

adding the time taken by all these steps. The run time of each step

is O( ). Hence the running time complexity of this algorithm is O(

).

Related Links[edit]

Stack (Wikipedia)

Queues[edit]

A queue is a basic data structure that is used throughout

programming. You can think of it as a line in a grocery store. The

first one in the line is the first one to be served.Just like a queue.

A queue is also called a FIFO (First In First Out) to demonstrate the

way it accesses data.

Queue<item-type> Operations

enqueue(new-item:item-type)

front():item-type

dequeue()

is-empty():Boolean

is-full():Boolean

get-size():Integer

All operations except get-size() can be

performed in

time. get-

The basic linked list implementation uses

a singly-linked list with a tail pointer to

keep track of the back of the queue.

type Queue<item_type>

data list:Singly Linked

List<item_type>

data tail:List

Iterator<item_type>

constructor()

list := new Singly-LinkedList()

tail := list.get-begin() #

null

end constructor

you simply add it to the back of the item

pointed to by the tail pointer. So the

previous tail is considered next compared

to the item being added and the tail pointer

points to the new item. If the list was

empty, this doesn't work, since the tail

iterator doesn't refer to anything

method

enqueue(new_item:item_type)

if is-empty()

list.prepend(new_item)

tail := list.get-begin()

else

list.insert_after(new_item,

tail)

tail.move-next()

end if

end method

one referred to by the linked list's head

pointer

method front():item_type

return list.get-begin().getvalue()

end method

the list, simply point the head pointer to

the previous from head item. The old head

item is the one you removed of the list. If

the list is now empty, we have to fix the tail

iterator.

method dequeue()

list.remove-first()

if is-empty()

tail := list.get-begin()

end if

end method

if the list is empty.

method is-empty():Boolean

return list.is-empty()

end method

considered to be limitless in size.

method is-full():Boolean

return False

end method

through to the list.

method get-size():Integer

return list.get-size()

end method

end type

Performance Analysis[edit]

In a linked list, accessing the first element

is an

enqueue, front, and dequeue are a

quick

operations.

here are also

on the performance of the corresponding

operation in the linked list implementation.

It could be either

, or

made. Most of the time, users of a Queue

do not use the getSize() operation, and

so a bit of space can be saved by not

optimizing it.

Circular Array Implementation[edit]

Performance Analysis[edit]

Priority Queue Implementation[edit]

To do:

Discuss priority queues and implementations includ

lists and various heaps.

Related Links[edit]

Queue (Wikipedia)

Deques[edit]

A Deque is a homogeneous list of

elements in which insertions and deletion

operations are performed on both the

ends.

Because of this property it is known as

double ended queue i.e. Deque

Deque has two types:

1. Input restricted queue: It allows

insertion at only one end

2. Output restricted queue: It allows

deletion at only one end

Data Structures

Introduction - Asymptotic

Stacks & Queues - Trees - Min & Max

Heaps - Graphs

Hash Tables - Sets - Tradeoffs

References[edit]

1. Jump up to:a b Dromey, R.G. How to

Solve it by Computer. Prentice Hall

of India.

2. Jump up to:a b Data structures,

Algorithms and Applications in C++

by Sartaj Sahni

Arpita. Magnifying Data Structures.

PHI.

Category:

Data Structures

From Wikipedia, the free encyclopedia

This article needs additional citations for verification. Please

help improve this article by adding citations to reliable sources. Unsourced

material may be challenged and removed. (August 2010)

A simple unordered tree; in this diagram, the node labeled 7 has two children, labeled 2 and 6, and one parent,

labeled 2. The root node, at the top, has no parent.

In computer science, a tree is a widely used abstract data type (ADT) or data structure implementing

this ADT that simulates a hierarchical tree structure, with a root value and subtrees of children,

represented as a set of linked nodes.

A tree data structure can be defined recursively (locally) as a collection of nodes(starting at a root

node), where each node is a data structure consisting of a value, together with a list of references to

nodes (the "children"), with the constraints that no reference is duplicated, and none points to the

root.

Alternatively, a tree can be defined abstractly as a whole (globally) as an ordered tree, with a value

assigned to each node. Both these perspectives are useful: while a tree can be analyzed

mathematically as a whole, when actually represented as a data structure it is usually represented

and worked with separately by node (rather than as a list of nodes and an adjacency list of edges

between nodes, as one may represent adigraph, for instance). For example, looking at a tree as a

whole, one can talk about "the parent node" of a given node, but in general as a data structure a

given node only contains the list of its children, but does not contain a reference to its parent (if any).

Contents

[hide]

1 Definition

o

2.2 Recursive

2.4 Mathematical

3 Terminology

4 Drawing graphs

5 Representations

6 Generalizations

o

6.1 Digraphs

7 Traversal methods

8 Common operations

9 Common uses

10 See also

o

11 Notes

12 References

13 External links

Definition[edit]

A tree is a non-linear data structure that consists of a root node and potentially many levels of

additional nodes that form a hierarchy. A tree can be empty with no nodes called the null or empty

tree or a tree is a structure consisting of one node called the root and one or more subtrees.

Level - The level of a node is defined by 1 + the number of connections between the node

and the root.

Height - The height of a node is the number of edges on the longest downward path

between the node and a leaf.

There is a distinction between a tree as an abstract data type and as a data structure, analogous to

the distinction between alist and a linked list.

As a data type, a tree has a value and children, and the children are themselves trees; the value and

children of the tree are interpreted as the value of the root node and the subtrees of the children of

the root node. To allow finite trees, one must either allow the list of children to be empty (in which

case trees can be required to be non-empty, an "empty tree" instead being represented by a forest of

zero trees), or allow trees to be empty, in which case the list of children can be of fixed size

(branching factor, especially 2 or "binary"), if desired.

As a data structure, a linked tree is a group of nodes, where each node has a value and a list

of references to other nodes (its children). This data structure actually defines a directed graph,

[a]

because it may have loops or several references to the same node, just as a linked list may have a

loop. Thus there is also the requirement that no two references point to the same node (that each

node has at most a single parent, and in fact exactly one parent, except for the root), and a tree that

violates this is "corrupt".

Due to the use of references to trees in the linked tree data structure, trees are often discussed

implicitly assuming that they are being represented by references to the root node, as this is often

how they are actually implemented. For example, rather than an empty tree, one may have a null

reference: a tree is always non-empty, but a reference to a tree may be null.

Recursive[edit]

Recursively, as a data type a tree is defined as a value (of some data type, possibly empty), together

with a list of trees (possibly an empty list), the subtrees of its children; symbolically:

More elegantly, via mutual recursion, of which a tree is one of the most basic examples, a tree can

be defined in terms of a forest (a list of trees), where a tree consists of a value and a forest (the

subtrees of its children):

t: v f

Note that this definition is in terms of values, and is appropriate in functional languages (it

assumes referential transparency); different trees have no connections, as they are simply lists of

values.

As a data structure, a tree is defined as a node (the root), which itself consists of a value (of some

data type, possibly empty), together with a list of references to other nodes (list possibly empty,

references possibly null); symbolically:

This data structure defines a directed graph,[b] and for it to be a tree one must add a condition on its

global structure (its topology), namely that at most one reference can point to any given node (a

node has at most a single parent), and no node in the tree point to the root. In fact, every node

(other than the root) must have exactly one parent, and the root must have no parents.

Indeed, given a list of nodes, and for each node a list of references to its children, one cannot tell if

this structure is a tree or not without analyzing its global structure and checking that it is in fact

topologically a tree, as defined below.

Type theory[edit]

As an ADT, the abstract tree type T with values of some type E is defined, using the abstract forest

type F (list of trees), by the functions:

value: T E

children: T F

nil: () F

node: E F T

with the axioms:

value(node(e, f)) = e

children(node(e, f)) = f

In terms of type theory, a tree is an inductive type defined by the

constructors nil (empty forest) and node (tree with root node with given

value and children).

Mathematical[edit]

Viewed as a whole, a tree data structure is an ordered tree, generally with

values attached to each node. Concretely, it is (if required to be non-empty):

A rooted tree with the "away from root" direction (a more narrow term is

an "arborescence"), meaning:

A directed graph,

connected by exactly one simple path),

from the root; given an edge, the node that the edge points from is

called the parent and the node that the edge points to is called

the child),

together with:

factor (outdegree), particularly always having two child nodes (possibly

empty, hence at most two non-empty child nodes), hence a "binary tree".

Allowing empty trees makes some definitions simpler, some more

complicated: a rooted tree must be non-empty, hence if empty trees are

allowed the above definition instead becomes "an empty tree, or a rooted

tree such that ...". On the other hand, empty trees simplify defining fixed

branching factor: with empty trees allowed, a binary tree is a tree such that

every node has exactly two children, each of which is a tree (possibly

empty).The complete sets of operations on tree must include fork operation.

Terminology[edit]

A node is a structure which may contain a value or condition, or represent a

separate data structure (which could be a tree of its own). Each node in a

tree has zero or more child nodes, which are below it in the tree (by

convention, trees are drawn growing downwards). A node that has a child is

called the child's parent node (or ancestor node, or superior). A node has

at most one parent.

An internal node (also known as an inner node, inode for short,

or branch node) is any node of a tree that has child nodes. Similarly,

an external node (also known as an outer node, leaf node, or terminal

node) is any node that does not have child nodes.

The topmost node in a tree is called the root node. Depending on

definition, a tree may be required to have a root node (in which case all

trees are non-empty), or may be allowed to be empty, in which case it does

not necessarily have a root node. Being the topmost node, the root node

will not have a parent. It is the node at which algorithms on the tree begin,

since as a data structure, one can only pass from parents to children. Note

that some algorithms (such as post-order depth-first search) begin at the

root, but first visit leaf nodes (access the value of leaf nodes), only visit the

root last (i.e., they first access the children of the root, but only access

the value of the root last). All other nodes can be reached from it by

following edges orlinks. (In the formal definition, each such path is also

unique.) In diagrams, the root node is conventionally drawn at the top. In

some trees, such as heaps, the root node has special properties. Every

node in a tree can be seen as the root node of the subtree rooted at that

node.

The height of a node is the length of the longest downward path to a leaf

from that node. The height of the root is the height of the tree. The depth of

a node is the length of the path to its root (i.e., its root path). This is

commonly needed in the manipulation of the various self-balancing

trees, AVL Trees in particular. The root node has depth zero, leaf nodes

have height zero, and a tree with only a single node (hence both a root and

leaf) has depth and height zero. Conventionally, an empty tree (tree with no

nodes, if such are allowed) has depth and height 1.

A subtree of a tree T is a tree consisting of a node in T and all of its

descendants in T.[c][1] Nodes thus correspond to subtrees (each node

corresponds to the subtree of itself and all its descendants) the subtree

corresponding to the root node is the entire tree, and each node is the root

node of the subtree it determines; the subtree corresponding to any other

node is called a proper subtree (by analogy to a proper subset).

Drawing graphs[edit]

Trees are often drawn in the plane. Ordered trees can be represented

essentially uniquely in the plane, and are hence calledplane trees, as

follows: if one fixes a conventional order (say, counterclockwise), and

arranges the child nodes in that order (first incoming parent edge, then first

child edge, etc.), this yields an embedding of the tree in the plane, unique

up to ambient isotopy. Conversely, such an embedding determines an

ordering of the child nodes.

If one places the root at the top (parents above children, as in a family tree)

and places all nodes that are a given distance from the root (in terms of

number of edges: the "level" of a tree) on a given horizontal line, one

obtains a standard drawing of the tree. Given a binary tree, the first child is

on the left (the "left node"), and the second child is on the right (the "right

node").

Representations[edit]

There are many different ways to represent trees; common representations

represent the nodes as dynamically allocatedrecords with pointers to their

between them determined by their positions in the array (e.g., binary heap).

Indeed, a binary tree can be implemented as a list of lists (a list where the

values are lists): the head of a list (the value of the first term) is the left child

(subtree), while the tail (the list of second and future terms) is the right child

(subtree). This can be modified to allow values as well, as in Lisp Sexpressions, where the head (value of first term) is the value of the node,

the head of the tail (value of second term) is the left child, and the tail of the

tail (list of third and future terms) is the right child.

In general a node in a tree will not have pointers to its parents, but this

information can be included (expanding the data structure to also include a

pointer to the parent) or stored separately. Alternatively, upward links can

be included in the child node data, as in a threaded binary tree.

Generalizations[edit]

Digraphs[edit]

If edges (to child nodes) are thought of as references, then a tree is a

special case of a digraph, and the tree data structure can be generalized to

represent directed graphs by removing the constraints that a node may

have at most one parent, and that no cycles are allowed. Edges are still

abstractly considered as pairs of nodes, however, the

terms parent and child are usually replaced by different terminology (for

example, source and target). Different implementation strategies exist: a

digraph can be represented by the same local data structure as a tree

(node with value and list of children), assuming that "list of children" is a list

of references, or globally by such structures as adjacency lists.

In graph theory, a tree is a connected acyclic graph; unless stated

otherwise, in graph theory trees and graphs are assumed undirected. There

is no one-to-one correspondence between such trees and trees as data

structure. We can take an arbitrary undirected tree, arbitrarily pick one of

its vertices as the root, make all its edges directed by making them point

away from the root node producing an arborescence and assign an

order to all the nodes. The result corresponds to a tree data structure.

Picking a different root or different ordering produces a different one.

Given a node in a tree, its children define an ordered forest (the union of

subtrees given by all the children, or equivalently taking the subtree given

by the node itself and erasing the root). Just as subtrees are natural for

recursion (as in a depth-first search), forests are natural for corecursion (as

in a breadth-first search).

by root nodes), where a node (of a tree) consists of a value and a forest (its

children):

n: v f

Traversal methods[edit]

Main article: Tree traversal

Stepping through the items of a tree, by means of the connections between

parents and children, is called walking the tree, and the action is a walk of

the tree. Often, an operation might be performed when a pointer arrives at a

particular node. A walk in which each parent node is traversed before its

children is called a pre-order walk; a walk in which the children are

traversed before their respective parents are traversed is called a postorder walk; a walk in which a node's left subtree, then the node itself, and

finally its right subtree are traversed is called an in-order traversal. (This

last scenario, referring to exactly two subtrees, a left subtree and a right

subtree, assumes specifically a binary tree.) A level-order walk effectively

performs abreadth-first search search over the entirety of a tree; nodes are

traversed level by level, where the root node is visited first, followed by its

direct child nodes and their siblings, followed by its grandchild nodes and

their siblings, etc., until all nodes in the tree have been traversed.

Common operations[edit]

Deleting an item

Common uses[edit]

search tree and tree traversal)

Routing algorithms

See also[edit]

Tree structure

Hierarchy (mathematics)

Dialog tree

Single inheritance

Other trees[edit]

DSW algorithm

Enfilade

Notes[edit]

1. Jump up^ Properly, a rooted, ordered directed graph.

2. Jump up^ Properly, a rooted, ordered directed graph.

3. Jump up^ This is different from the formal definition of subtree used in

graph theory, which is a subgraph that forms a tree it need not

subtree in the graph theory sense, but not in the data structure sense

(unless there are no descendants).

References[edit]

1. Jump up^ Weisstein, Eric W., "Subtree", MathWorld.

Algorithms, Third Edition. Addison-Wesley, 1997. ISBN 0-201-89683-4 .

Section 2.3: Trees, pp. 308423.

Stein. Introduction to Algorithms, Second Edition. MIT Press and McGrawHill, 2001. ISBN 0-262-03293-7 . Section 10.4: Representing rooted trees,

pp. 214217. Chapters 1214 (Binary Search Trees, Red-Black Trees,

Augmenting Data Structures), pp. 253320.

External links[edit]

Wikimedia Commons

has media related

to Tree data

structure.

Knipe

WormWeb.org: Interactive Visualization of the C. elegans Cell Tree Visualize the entire cell lineage tree of the nematode C.

elegans (javascript)

[ref : http://www.allisons.org/ll/AlgDS/Tree/]

[show]

V

T

E

From Wikipedia, the free encyclopedia

help improve this article byadding citations to reliable sources.

Unsourced material may be challenged and removed. (October 2010)

the graph and hypergraph concepts from mathematics.

A graph data structure consists of a finite (and possibly mutable) set of ordered pairs,

called edges or arcs, of certain entities called nodes or vertices. As in mathematics, an edge (x,y)

is said to point or go from x to y. The nodes may be part of the graph structure, or may be external

entities represented by integer indices or references.

A graph data structure may also associate to each edge some edge value, such as a symbolic label

or a numeric attribute (cost, capacity, length, etc.).

Contents

[hide]

1 Algorithms

2 Operations

3 Representations

4 See also

5 References

6 External links

Algorithms[edit]

Graph algorithms are a significant field of interest within computer science. Typical higher-level

operations associated with graphs are: finding a path between two nodes, like depth-first

search and breadth-first search and finding the shortest path from one node to another, like Dijkstra's

algorithm. A solution to finding the shortest path from each node to every other node also exists in

the form of the FloydWarshall algorithm.

Operations[edit]

The basic operations provided by a graph data structure G usually include:

adjacent (G, x, y): tests whether there is an edge from node x to node y.

neighbors (G, x): lists all nodes y such that there is an edge from x to y.

get_node_value (G, x): returns the value associated with the node x.

set_node_value (G, x, a): sets the value associated with the node x to a.

get_edge_value (G, x, y): returns the value associated to the edge (x,y).

set_edge_value (G, x, y, v): sets the value associated to the edge (x,y) to v.

Representations[edit]

Different data structures for the representation of graphs are used in practice:

Adjacency list

Vertices are stored as records or objects, and every vertex stores a list of adjacent vertices.

This data structure allows the storage of additional data on the vertices. Additional data can

be stored if edges are also stored as objects, in which case each vertex stores its incident

edges and each edge stores its incident vertices.

Adjacency matrix

A two-dimensional matrix, in which the rows represent source vertices and columns

represent destination vertices. Data on edges and vertices must be stored externally. Only

the cost for one edge can be stored between each pair of vertices.

Incidence matrix

A two-dimensional Boolean matrix, in which the rows represent the vertices and columns

represent the edges. The entries indicate whether the vertex at a row is incident to the edge

at a column.

The following table gives the time complexity cost of performing various operations on

graphs, for each of these representations.[citation needed] In the matrix representations, the

entries encode the cost of following an edge. The cost of edges that are not present are

assumed to be

.

Adjacency list

Adjacency matrix

Incidence matrix

Storage

Add vertex

Add edge

Remove vertex

Remove edge

Query: are

vertices u, v

adjacent?

(Assuming that

the storage

positions for u, v

are known)

Remarks

or vertices, need to

add/remove

vertices and edges,

edges

vertices, because

matrix must be

resized/copied

be resized/copied

Adjacency lists are generally preferred because they efficiently represent sparse graphs.

An adjacency matrix is preferred if the graph is dense, that is the number of edges |E| is

close to the number of vertices squared, |V|2, or if one must be able to quickly look up if

there is an edge connecting two vertices.[1]

See also[edit]

Graph rewriting for rule based transformations of graphs (graph data structures)

GraphStream

Graphviz

yEd Graph Editor Java-based diagram editor for creating and editing graphs

References[edit]

1. Jump up^ Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein,

Clifford (2001). Introduction to Algorithms (2nd ed.). MIT Press and McGraw

Hill. ISBN 0-262-53196-8.

External links[edit]

[hide]

V

T

E

Data structures

Types

Abstr

act

Arrays

Linke

d

Trees

Graph

s

Collection

Container

Associative array

Double-ended priority queue

Double-ended queue

List

Multimap

Priority queue

Queue

Set

multiset

Disjoint Sets

Stack

Bit array

Circular buffer

Dynamic array

Hash table

Hashed array tree

Sparse array

Association list

Linked list

Skip list

Unrolled linked list

XOR linked list

B-tree

Binary search tree

AA

AVL

red-black

self-balancing

splay

Heap

binary

binomial

Fibonacci

R-tree

R*

R+

Hilbert

Trie

Hash tree

Directed acyclic graph

Directed acyclic word graph

- EteDiunggah olehDavor Profesor
- COS3751-201-1-2017.pdfDiunggah olehFreePDFs
- Data Structure NotesDiunggah olehShakeel Amin
- SEfromLG_NoTG.pdfDiunggah olehhoffmange
- Cornell CS578: Decision TreesDiunggah olehIan
- 1 - Mining Game Logs to Create a Playbook for Unit AIsDiunggah olehfoxxxx
- DominatorsDiunggah olehKB
- Assignment 5 - Stacks and QueuesDiunggah olehTheAkHolic
- Multilayer Neural NetworksDiunggah olehdullson
- Eliminating Noisy Information in Web Pages for Data MiningDiunggah olehRaahul Sen
- bitstream_1668133.pdfDiunggah olehyekych
- 40-DAFx-16_paper_35-PN.pdfDiunggah olehAlex Arm.
- IJERD (www.ijerd.com) International Journal of Engineering Research and Development IJERD : hard copy of journal, Call for Papers 2012, publishing of journal, journal of science and technology, research paper publishing, where to publish research paper, journal publishing, how to publish research paper, Call For research paper, international journal, publishing a paper, how to get a research paper published, publishing a paper, publishing of research paper, reserach and review articles, IJERD Journal, How to publish your research paper, publish research paper, open access engineering journal, Engineering journal, Mathemetics journal, Physics journal, Chemistry journal, Computer Engineering, how to submit your paper, peer review journal, indexed journal, reserach and review articles, engineering journal, www.ijerd.com, research journals, yahoo journals, bing journals, International Journal of Engineering Research and Development, google journals, journal of engineering, online SubmisDiunggah olehIJERD
- 2015-improgDiunggah olehajitkarthik
- 1Diunggah olehdddcdr
- SolutionAssessedCourseworkDiunggah olehshahzad5alam
- Airport SimulationDiunggah olehMian Aqeel Yousaf
- XML StoreDiunggah olehJorge Acosta Lizarraga
- full notes.pdfDiunggah olehvsc creations
- Blocking QueueDiunggah olehAnkit Srivastava
- Java Practicals Data StructuresDiunggah olehPrasanth Kumar
- Arena ModsDiunggah olehmouad hamdani
- waeiruyaweiryjfaiuydiuasdytiawyeiqyweiuaidgasiufaskgfuaskfiugasDiunggah olehkevin juli
- QuizDiunggah olehRajeev Pathak
- Data StructureDiunggah olehserfx
- STIA2023_StackNQueueDiunggah olehHafizi Nordin
- Data StructuresDiunggah olehwalne
- Assignment 7 SummerDiunggah olehGoeme Nthomiwa
- Binary+and+Other+TreesDiunggah olehPrateek Baheti
- Binary Search TreeDiunggah olehAditya

- HTML.docxDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Linked ListDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- e CommerceDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- IQACGuidelines & AQARFormatJan2014Diunggah olehSujith Kuttan
- ICAR JRFDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Data Structure Viva QueDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Mysql Questions and Answers Are BelowDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Windows 2000Diunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- WHAT IS DOS?Diunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- ComputerDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Memory managementDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Linked listDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- SORTING AND SEARCHINGDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- INPUT DEVICESDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Central processing unitDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Introduction to ComputersDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Unique Visitors – ExplainedDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- InternetDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- MICROSOFT OFFICEDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- WHAT IS SOFTWARE AND ANY FIVE TYPES OF SOFTWAREDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- INPUT AND OUTPUT DEVICESDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Questions and Answer Midterm MisDiunggah olehaksoniwala
- vb.docDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Maharashtra Industrial Development Corporation.docxDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- System-Software.docxDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Current Affairs Quiz April 2012Diunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ
- Data Structure MCQDiunggah olehVallari Shah
- Microsoft Quiz.docxDiunggah olehᗬᗴᐻ ᔤᗩᕼᕢᖆᘍ

- A Quick Introduction to Version Control With Git and GitHubDiunggah olehestyerkol
- Raspberry Pi • View Topic - Connect Raspi to a ProxyDiunggah olehLeague UNAB
- ecadlab.pdfDiunggah olehSubrahmanyam Vjs
- O'Reilly - Web CachingDiunggah olehmrasquinho
- How to GeekToolDiunggah olehkutzair
- Fish in FlacDiunggah olehPhuoc
- Puzzles1.pdfDiunggah olehaashuchatt
- CounterACT Switch Commands in Use by the Switch Plugin v8.9.4Diunggah olehThiên Hoàng
- CS6303 Computer ArchitectureDiunggah olehsamueljamespeter
- Digital Signal ProcessingDiunggah olehAswathy p s
- Release Notes e46x p631 e302Diunggah olehafhaalc
- Software Testing ReadingDiunggah olehAmrita Pradhan
- 10 MPI ProgrammesDiunggah olehmadhanacdc
- What's New in 670 Series Version 2.1 4CAE000159 RevDiunggah olehDaniel Felipe Losada Ramos
- MDM Protocol ReferenceDiunggah olehAldrin Redolme
- LinuxCheatsheet_2.docDiunggah olehNguyễn Xuân Phong
- Azure IaaS Overview.pdfDiunggah olehjensterd2040
- ant in fmsDiunggah olehGovardhan Kudumula
- ECX4265-TMA2Diunggah olehSumesh N Mahesha
- 1803.08018Diunggah olehAlex Hu
- GSQADiunggah olehandryi_7774756
- Datafix Xxswcl Recipe Vrs Obsolete All Ea ItemsDiunggah olehmastanvali.shaik84359
- HP SRA GuideDiunggah olehIM_5727
- SAP R/3 Basis Technology BusinessDiunggah olehamrzz
- 3003195-Ins EXselect Plugin MagiCAD GBDiunggah olehCicoare Lavinia
- Mastering Grails - GORM - Funny Name, SeriousDiunggah olehSander Spilleman
- Building XML Web Services for the Microsoft .NET PlatformDiunggah olehTom Jobim
- Mikroposesor Dan MikrokontrolerDiunggah olehAg'Ra Budiansyach
- Nas and as Security KeyDiunggah olehVishal Kushwaha
- FTP ProxyDiunggah olehArie Jugovic

## Lebih dari sekadar dokumen.

Temukan segala yang ditawarkan Scribd, termasuk buku dan buku audio dari penerbit-penerbit terkemuka.

Batalkan kapan saja.