演算法實戰(三) 求K Pairs

2021-07-15 03:43:50 字數 1733 閱讀 1475

題目連線如下:求k-pairs

這道題考察的是堆排序(直接上**):

#include

#include

#include

using

namespace

std;

struct element

*pelement;

static

bool cmp(element a, element b)

element fun(vector

&_heap)

int min(int a, int b)

//求取取值界限;

size_t size1= min((int)nums1.size(), k);

size_t size2= min((int)nums2.size(), k);

size_t threshold = min(size1*size2, k);

//初始化堆;

heap.reserve(size1);

for(int i = 0; i < size1; i++)

//獲取元素;

reslt.reserve(threshold);

while(reslt.size() != threshold)

}return reslt;

}};

前兩節中我們沒有討論時間複雜度和空間複雜度的問題,因為前兩道題比較簡單,這個問題是乙個中等難度的問題,我們現在就要考慮的更深層次。

我們首先計算一下我們設計的演算法的空間複雜度

我們所占用的空間就是維持堆運算所占用的空間,也就是vector heap所占用的大小:

理論值:

heap.szie()*sizeof(int) (0<=heap.size()<= min(k, nums1.size))

實際值:

但實際上動態陣列在分配記憶體的時候往往會大於實際大小:

heap.capacity(),才是真正分配的記憶體大小,而且移除資料vector快取區大小不會改變(vector記憶體分配機制)。

綜上所述我們的空間複雜度為:

heap.capacity()。

然後我們在求解一下演算法的時間複雜度

theap(n) 代表堆排序所用的時間, n代表陣列中元素的個數;

n 代表我們執行堆排序的次數;

而在我們的**中: n = min(nums1.size()*nums2.size(), k);

我們每次從堆中取出堆頂資料(最小和元素),然後再加入乙個新的元素,直到取滿k個,所以n的取值範圍:

0<= n <= min(nums1.size(),k);

n = k(即,nums1.size()*nums2.size()>= k), n = k(即,nums1.size() >= k),由此可得:

t(n) = k*theap(k) ...

...(1);

theap(k) = o(k*log(k)) ...

...(2);

根據(1)、(2)可匯出:

t(n) = o(square(k)*log(k));

綜上所述,演算法的時間複雜度為:

t(n) = o(square(k)*log(k));

這裡有堆排序的說明連線。

LeetCode實戰 求眾數

you may assume that the array is non empty and the majority element always exist in the array.example 1 input 3 2,3 output 3example 2 input 2 2,1 1,1 ...

Knn演算法實戰

三 完整 或者尋找最近的k個資料,推測新資料的分類。import csv with open e 資資 python練習 knn prostate cancer.csv r as file dictreader把資料讀成字典 reader csv.dictreader file datas row ...

KNN演算法實戰

time 2021 1 4 20 37 file knn.py from sklearn.datasets import load iris from sklearn.model selection import train test split from sklearn.preprocessing...