Quick Selection
2020-1ํ๊ธฐ, ๋ํ์์ โ์๊ณ ๋ฆฌ์ฆโ ์์ ์ ๋ฃ๊ณ ๊ณต๋ถํ ๋ฐ๋ฅผ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ์ง์ ์ ์ธ์ ๋ ํ์์ ๋๋ค :) ์ ์ฒด ํฌ์คํธ๋ Algorithm ํฌ์คํธ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
๋ค์ด๊ฐ๋ฉฐPermalink
์์์ ์ซ์ ๋ฐฐ์ด์ด ์์ ๋
IdeaPermalink
โQuick Selectionโ์ ์์ด๋์ด๋ ํต ์ ๋ ฌ๊ณผ ์ ๋ง ๋น์ทํ๋ค! โQuick Selectionโ๋ pivot์ ๊ณ ๋ฅด๊ณ left, center, right๋ก ๋ฐฐ์ด์ ๋ถํ ํ๋ค.
- input: a list
of numbers and an integer - output: The
-th smallest elt in
Choose a number

์ด์
โQuick Selectionโ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋จํ์ง๋ง ๊ฐ๋ ฅํ๋ค ๐
How to set pivotPermalink
โQuick Selectionโ์ ์ฃผ์ํ ์ด์๋ ๊ธฐ์ค์ด ๋๋
์ฌ์ค ์ข์ pivot์ ์ก๊ธฐ ์ํ ๋ ๋ง์ ๊ณ ์ฐฐ๋ค์ด ์์ง๋ง ์ด๋ฒ ํฌ์คํธ์์๋ โQuick Selectionโ์ ์์ด๋์ด๋ง ๊ฐ๋จํ ์ค๋ช
ํ๊ณ ๋์ด๊ฐ๋๋ก ํ๊ฒ ๋ค. pivot์ ์ ์ก๊ฒ ๋๋ฉด
๐ Quick Selection ์๊ณ ๋ฆฌ์ฆ
๐ Median of Medians ์๊ณ ๋ฆฌ์ฆ
ImplementationPermalink
๋ฆฌํธ์ฝ๋์ 215. Kth Largest Element in an Array ๋ฌธ์ ๋ฅผ ํตํด ํด๋น ๋ฌธ์ ๋ฅผ ํ์ด๋ณผ ์ ์์ต๋๋ค.
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
# print(sorted(nums))
mid = len(nums) // 2
pivot = nums[mid]
less_list = []
same_list = []
more_list = []
for num in nums:
if pivot == num:
same_list.append(num)
elif pivot < num:
more_list.append(num)
else:
less_list.append(num)
if len(more_list) >= k:
return self.findKthLargest(more_list, k)
elif k <= (len(more_list) + len(same_list)):
return pivot
else:
return self.findKthLargest(less_list, k - (len(more_list) + len(same_list)))
์ฐธ๊ณ ๋ก C++์์๋ โQuick Selectionโ์ ๊ตฌํํ ํ์์์ด nth_element()
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค ๐