RECITATION 1

 
RECITATION 1
ANALYSIS OF ALGORITHMS
24.02.2017
 
Why do we analyze the algorithms?
 
Focus on the goal of better quantifying the relationship between problem size and running time.
 
-You are likely to be able to solve the some problems for 1 million integer in a reasonable amount of time
on your computer with the linearitmic algorithm,but you would have to wait quite a long time to do it with the
 quadratic algorithm.
 
As the problem size increasing,the running time of algorithms increase,too.
 
-Effective, efficient and faster algorithms
 
Exercises 1
 
Write a program that, given two sorted arrays of N int values, prints
all elements that appear in both arrays, in sorted order. The running
time of your program
 
should be proportional to N in the worst case.
 
Solution1
 
public class 
Q1 {
   
public static void 
run(){
ans1(IOUtils.readSortedArray("
resources\\q1\\arr1k_1.txt
"),IOUtils.readSortedArray("
resources\\q1\\arr1k_2.txt
"));
                                          }
 
Running Time??
 
Solution1
 
Running Time??
 
Exercises 2
 
Local minimum of an array. Write a program that, given an array a[]
of N
 
distinct integers, finds a local minimum: an entry a[i] that is
strictly less than its neighbors. Each internal entry (other than a[0]
and a[N-1]) has 2 neighbors. Your program
 
should use ~2 lg N
compares in the worst case.
 
Solution 2
 
Running Time??
 
Solution 2
 
Exercises 3
 
Faster 3-sum. As a warmup, develop an implementation
TwoSumFaster that uses a linear algorithm to count the pairs that
sum to zero after the array is sorted (instead of the binary-search-
based linearithmic algorithm). Then apply a similar idea to develop a
quadratic algorithm for the 3-sum problem.
 
 
public static 
int twoSum(int[] array){
  
Stopwatch timer = new Stopwatch();
  
int count = 0;
  
for(int i = 0; i < array.length; i++)
   
for(int j = i + 1; j < array.length; j++)
    
if(array[i] + array[j] == 0){
     
count++;
    
}
  
System.out.println("Time : " + timer.elapsedTime());
 
Running Time??
 
 
public static 
int twoSumFast(int[] array){
  
Stopwatch timer = new Stopwatch();
  
int count = 0;
  
for(int i = 0; i < array.length; i++)
   
if(Algorithms.binarySearch(array, -array[i]) > i)
    
count++;
 
  
System.out.println("Time : " + timer.elapsedTime());
  
return count;
 
}
 
Running Time??
 
 
public static 
int twoSumFaster(int[] array){
  
Stopwatch timer = new Stopwatch();
  
int count = 0;
  
int start = 0;
  
int end = array.length - 1;
  
while(start < end){
   
if(array[start] + array[end] == 0){
    
count++;
    
start++;
    
end--;
   
}
   
else if(array[start] + array[end] > 0){
    
end--;
   
}
   
else
    
start++;
  
}
  
System.out.println("Time : " + timer.elapsedTime());
  
return count;
 
Running Time??
 
 
public static 
int threeSum(int[] array){
  
Stopwatch timer = new Stopwatch();
  
int count = 0;
  
for(int i = 0; i < array.length; i++)
   
for(int j = i + 1; j < array.length; j++)
    
for(int k = j + 1; k < array.length; k++)
     
if(array[i] + array[j] + array[k] == 0){
      
count++;
     
}
  
System.out.println("Time : " + timer.elapsedTime());
  
return count;
 
Running Time??
 
 
public static 
int threeSumFast(int[] array){
  
Stopwatch timer = new Stopwatch();
  
int count = 0;
  
for(int i = 0; i < array.length; i++)
   
for(int j = i + 1; j < array.length; j++)
    
if(Algorithms.binarySearch(array, -1 * (array[i] + array[j])) > j)
     
count++;
 
  
System.out.println("Time : " + timer.elapsedTime());
  
return count;
 
Running Time??
 
 
public static 
int threeSumFaster(int[] array){
  
Stopwatch timer = new Stopwatch();
  
int count = 0;
  
for(int i = 0; i < array.length - 2; i++){
   
int start = i + 1;
   
int end = array.length - 1;
   
while(start < end){
    
if(array[i] + array[start] + array[end] == 0){
     
count++;
     
end--;
     
start++;
    
}
    
else if(array[i] + array[start] + array[end] > 0)
     
end--;
    
else
     
start++;
   
}
  
}
  
System.out.println("Time : " + timer.elapsedTime());
  
return count;
 
Running Time??
Slide Note
Embed
Share

Understanding and analyzing algorithms is essential for developing effective and efficient solutions to problems. By quantifying the relationship between problem size and running time, we can optimize our code to ensure faster performance. This includes techniques like finding common elements in sorted arrays, locating local minimums in arrays, and developing algorithms for tasks like the 3-sum problem. Through careful analysis and execution, we can achieve better time complexity and solve challenges more swiftly.

  • Algorithm Analysis
  • Efficiency
  • Problem Solving
  • Optimization
  • Time Complexity

Uploaded on Oct 10, 2024 | 1 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author.If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

You are allowed to download the files provided on this website for personal or commercial use, subject to the condition that they are used lawfully. All files are the property of their respective owners.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author.

E N D

Presentation Transcript


  1. RECITATION 1 ANALYSIS OF ALGORITHMS 24.02.2017

  2. Why do we analyze the algorithms? Focus on the goal of better quantifying the relationship between problem size and running time. -You are likely to be able to solve the some problems for 1 million integer in a reasonable amount of time on your computer with the linearitmic algorithm,but you would have to wait quite a long time to do it with the quadratic algorithm. As the problem size increasing,the running time of algorithms increase,too. -Effective, efficient and faster algorithms

  3. Exercises 1 Write a program that, given two sorted arrays of N int values, prints all elements that appear in both arrays, in sorted order. The running time of your program should be proportional to N in the worst case.

  4. Solution1 Running Time?? public class Q1 { public static void run(){ ans1(IOUtils.readSortedArray("resources\\q1\\arr1k_1.txt"),IOUtils.readSortedArray("resources\\q1\\arr1k_2.txt")); }

  5. Solution1 Running Time??

  6. Exercises 2 Local minimum of an array. Write a program that, given an array a[] of N distinct integers, finds a local minimum: an entry a[i] that is strictly less than its neighbors. Each internal entry (other than a[0] and a[N-1]) has 2 neighbors. Your program should use ~2 lg N compares in the worst case.

  7. Solution 2 Running Time??

  8. Solution 2

  9. Exercises 3 Faster 3-sum. As a warmup, develop an implementation TwoSumFaster that uses a linear algorithm to count the pairs that sum to zero after the array is sorted (instead of the binary-search- based linearithmic algorithm). Then apply a similar idea to develop a quadratic algorithm for the 3-sum problem.

  10. public static int twoSum(int[] array){ Stopwatch timer = new Stopwatch(); int count = 0; for(int i = 0; i < array.length; i++) for(int j = i + 1; j < array.length; j++) if(array[i] + array[j] == 0){ } System.out.println("Time : " + timer.elapsedTime()); Running Time?? count++;

  11. public static int twoSumFast(int[] array){ Stopwatch timer = new Stopwatch(); int count = 0; for(int i = 0; i < array.length; i++) if(Algorithms.binarySearch(array, -array[i]) > i) count++; Running Time?? } System.out.println("Time : " + timer.elapsedTime()); return count;

  12. public static int twoSumFaster(int[] array){ Stopwatch timer = new Stopwatch(); int count = 0; Running Time?? int start = 0; int end = array.length - 1; while(start < end){ if(array[start] + array[end] == 0){ count++; start++; end--; } else if(array[start] + array[end] > 0){ end--; } else start++; } System.out.println("Time : " + timer.elapsedTime()); return count;

  13. public static int threeSum(int[] array){ Stopwatch timer = new Stopwatch(); int count = 0; for(int i = 0; i < array.length; i++) for(int j = i + 1; j < array.length; j++) for(int k = j + 1; k < array.length; k++) System.out.println("Time : " + timer.elapsedTime()); return count; Running Time?? if(array[i] + array[j] + array[k] == 0){ count++; }

  14. public static int threeSumFast(int[] array){ Stopwatch timer = new Stopwatch(); int count = 0; for(int i = 0; i < array.length; i++) for(int j = i + 1; j < array.length; j++) if(Algorithms.binarySearch(array, -1 * (array[i] + array[j])) > j) count++; Running Time?? System.out.println("Time : " + timer.elapsedTime()); return count;

  15. public static int threeSumFaster(int[] array){ Stopwatch timer = new Stopwatch(); int count = 0; for(int i = 0; i < array.length - 2; i++){ int start = i + 1; Running Time?? int end = array.length - 1; while(start < end){ if(array[i] + array[start] + array[end] == 0){ count++; end--; start++; } else if(array[i] + array[start] + array[end] > 0) end--; else start++; } } System.out.println("Time : " + timer.elapsedTime()); return count;

More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#