Given a list of integers, the task is to find N largest elements assuming size of list is greater than or equal o N.
Examples :
Input : [4, 5, 1, 2, 9]
N = 2
Output : [9, 5]
Input : [81, 52, 45, 10, 3, 2, 96]
N = 3
Output : [81, 96, 52]
A simple solution traverse the given list N times. In every traversal, find the maximum, add it to result, and remove it from the list. Below is the implementation :
Python3
def Nmaxelements(list1, N):
final_list = []
for i in range ( 0 , N):
max1 = 0
for j in range ( len (list1)):
if list1[j] > max1:
max1 = list1[j]
list1.remove(max1)
final_list.append(max1)
print (final_list)
list1 = [ 2 , 6 , 41 , 85 , 0 , 3 , 7 , 6 , 10 ]
N = 2
Nmaxelements(list1, N)
|
Output :
[85, 41]
Time Complexity: O(N * size) where size is size of the given list.
Auxiliary space: O(N)
Method 2:
Python3
l = [ 1000 , 298 , 3579 , 100 , 200 , - 45 , 900 ]
n = 4
l.sort()
print (l[ - n:])
|
Output[298, 900, 1000, 3579]
Output:
[-45, 100, 200, 298, 900, 1000, 3579]
Find the N largest element: 4
[298, 900, 1000, 3579]
Time Complexity: O(nlogn)
Auxiliary Space: O(1)
Method 3: Using sort() and loop
Approach:
- Sort the given list
- Traverse the list up to N values and append elements in new array arr.
- Print the array arr.
Python3
l = [ 1000 , 298 , 3579 , 100 , 200 , - 45 , 900 ]
n = 4
l.sort()
arr = []
while n:
arr.append(l[ - n])
n - = 1
print (arr)
|
Output[298, 900, 1000, 3579]
Time Complexity: O(n*logn)
Auxiliary Space: O(n), where n is length of list.
Please refer k largest(or smallest) elements in an array for more efficient solutions of this problem.
Approach #4: Using heapq
Initialize a heap queue using the input list. Use the heapq.nlargest() function to find the N largest elements in the heap queue. Return the result.
Algorithm
1. Initialize a heap queue using the input list.
2. Use the heapq.nlargest() function to find the N largest elements in the heap queue.
3. Return the result.
Python3
import heapq
def find_n_largest_elements(lst, N):
heap = lst
return heapq.nlargest(N, heap)
lst = [ 4 , 5 , 1 , 2 , 9 ]
N = 2
print (find_n_largest_elements(lst, N))
lst = [ 81 , 52 , 45 , 10 , 3 , 2 , 96 ]
N = 3
print (find_n_largest_elements(lst, N))
|
Output[9, 5]
[96, 81, 52]
Time complexity: O(n log n), where n is the length of the input list due to building the heap.
Auxiliary Space: O(n), where n is the length of the input list, due to the heap queue.
Using numpy.argsort() function
note: install numpy module using command “pip install numpy”
Algorithm:
Convert the given list into a numpy array using np.array() function.
Use np.argsort() function to get the indices of the sorted numpy array in ascending order.
Use negative indexing and extract the last N indices from the sorted array.
Use the extracted indices to get the corresponding elements from the original numpy array.
Return the N maximum elements from the original list.
Python3
import numpy as np
def Nmaxelements(list1, N):
list1 = np.array(list1)
return list1[np.argsort(list1)[ - N:]]
list1 = [ 2 , 6 , 41 , 85 , 0 , 3 , 7 , 6 , 10 ]
N = 3
print (Nmaxelements(list1, N))
|
Output:
[10 41 85]
Time complexity:
Converting list to numpy array takes O(n) time, where n is the length of the list.
Sorting the numpy array using np.argsort() function takes O(nlogn) time.
Extracting the last N indices using negative indexing takes O(1) time.
Extracting the N maximum elements from the original list takes O(N) time.
Overall time complexity is O(nlogn).
Auxiliary Space:
The additional space required is to store the numpy array which takes O(n) space. Therefore, the space complexity is O(n).
Method : Using Sorted() + loop
Algorithm :
- A list of integers named “list” is initialized with the values [2, 1, 8, 7, 3, 0, 9, 4].
- An integer variable named “n” is initialized with the value 3. This variable specifies how many largest elements should be retrieved from the list.
- Two empty list variables, “res” and “list1”, are initialized.
- The original list is printed using the print() function and the “list” variable.
- The sorted() function is used to sort the list in descending order, and the sorted list is assigned to the “list1” variable.
- A for loop is used to iterate from 0 to n-1, and the first n elements of the sorted list are appended to the “res” list using the append() method.
- The sorted list is printed using the print() function and the “list1” variable.
- The n largest elements in the list are printed using the print() function, the number “n”, and the “res” list.
Python3
list = [ 2 , 1 , 8 , 7 , 3 , 0 , 9 , 4 ]
n = 3
res = []
list1 = []
print ( 'The given list is:' , list )
list1 = sorted ( list , reverse = True )
for i in range ( 0 , n):
res.append(list1[i])
print ( 'The sorted list is:' , list1)
print ( 'The ' , n, ' largest elements in the given list are:' , res)
|
OutputThe given list is: [2, 1, 8, 7, 3, 0, 9, 4]
The sorted list is: [9, 8, 7, 4, 3, 2, 1, 0]
The 3 largest elements in the given list are: [9, 8, 7]
Time Complexity : O(n log n)
Auxiliary Space : O(n)