<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 伴隨數組、計數排序的運用

伴隨數組、計數排序的運用

作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò ) 收藏
一個(gè)星期沒(méi)有寫(xiě)了,今天還是留點(diǎn)時(shí)間寫(xiě)一寫(xiě)自己的博客,周六去考試了趨勢科技,感受到了自己在軟件設計方面還存在的知識缺陷,測試、網(wǎng)絡(luò )安全等方面都是空白,其他的相對來(lái)說(shuō)要好一點(diǎn),今天還沒(méi)有收到面試通知應該是打了一次醬油了,不夠收獲還是蠻多的,記得第一題是關(guān)于unicode方面的選擇題,還有很多就是局部分配空間,返回無(wú)效指針的題目,總之感覺(jué)考得還是蠻基礎,但是又設置了不少的陷阱,我很多回來(lái)又想了想,還是覺(jué)得自己知識面太少了,對于一個(gè)非科班出生的人,確實(shí)還是需要花一定的時(shí)間惡補一下。

總結兩個(gè)題目吧,其中一個(gè)是多玩的題目:給你100萬(wàn)個(gè)數據,數據的值在0~65535之間 用最快的速度排序 ?

本文引用地址:http://dyxdggzs.com/article/201612/324528.htm

這樣的數據雖然算不上是海量數據,但是我在Windows下面反正是不能跑成功,每次都是棧溢出。換到linux環(huán)境下,順利的完成了數據的處理。首先分析一下自己的思路,很簡(jiǎn)單,如果采用快速排序算法應該是能夠完成排序的,時(shí)間復雜度應該是在O(N*logN),但是問(wèn)題是題目是要求最快的速度排序,我認為應該是考慮一些時(shí)間排序算法,首先我就想到了桶排序,計數排序之類(lèi)的,最后我選擇了計數排序,實(shí)際上由于數據的值在0~65535之間,所以肯定存在大量的數據是重復的,這個(gè)值實(shí)際上就滿(mǎn)足了計數排序的一些限制條件,采用hashmap的思想,統計相同值的個(gè)數,然后采用計數排序的思想,重新賦值數組即可。這時(shí)候的算法應該是非??焖俚?,時(shí)間復雜度應該為O(N),這種方法也存在一定的問(wèn)題,引入了額外的內存空間,和多玩要求的最快最少的內存空間存在一定的差別,但是時(shí)間上應該是比較快啦。

我的實(shí)現結合了hashmap的思想、計數排序的思想,實(shí)現代碼如下所示:

#define BUFSIZE 65536
#define DATASIZE 1000000

void countsort(int *a, int size)
{
int i = 0 , j = 0;
int countbuf[BUFSIZE] = {0};

for(i = 0; i < BUFSIZE; ++ i)
countbuf[i] = 0;

for(i = 0; i < size; ++ i)
countbuf[a[i]]++;

for(i = 1; i < BUFSIZE; ++ i)
{
countbuf[i] += countbuf[i - 1];
}

for(i = 0; i < countbuf[0]; ++ i)
a[i] = 0;

for(i = 1; i < BUFSIZE; ++ i)
{
for(j = countbuf[i-1]; j < countbuf[i]; ++ j)
a[j] = i;
}
}

另一個(gè)就是伴隨數組的運用,伴隨數組主要是保存了數組中數據的原來(lái)下標位置,這樣的存在形式可以避免在多次的修改中導致數組原有信息的丟失,特別是在一些保存歷史信息的運用中,伴隨數組是非常有用的。比如需要查找數組局部區域的第K個(gè)最小的值,這時(shí)候完全可以采用對局部區域進(jìn)行排序,找出第k個(gè)值,但是這也存在一個(gè)問(wèn)題,排序以后原有信息的丟失,如果重新選擇新的局部區域,上面的排序就使得下面的操作毫無(wú)意義。當然也可以采用分配K個(gè)內存的方法,這種方法就是創(chuàng )建一個(gè)大小為K的數據空間,遍歷數據,將滿(mǎn)足選定區間的數插入到新數組中,遍歷完數據以后就實(shí)現了數據的查找,這種方法對于少量排序的問(wèn)題是可以接受的,但是如果新創(chuàng )建的數據區間非常的大,對一個(gè)新數組的排序等操作也是非常嚇人的。

采用伴隨數組可以避免多次的排序操作,只需要一次排序就能完成不同區間的第K個(gè)最小值的查找操作,具體的實(shí)現如下:

首先創(chuàng )建一個(gè)節點(diǎn)數據結構,存在兩個(gè)成員,分別保存數據值和數值的下標,其中下標就表示了數據的歷史信息,可以用來(lái)還原數組等操作。遍歷數組創(chuàng )建節點(diǎn)數組。

其次,對節點(diǎn)數組進(jìn)行排序,排序通常采用快速排序的方法實(shí)現。

最后,遍歷節點(diǎn)數組值,當節點(diǎn)數組值的下標在所選擇的區間時(shí)就將K減1,當K == 0時(shí),這時(shí)候對應的數組值就是我們需要查找的局部區域的第K個(gè)最小值。

對于其他區間的實(shí)現方法只需要對最后一步進(jìn)行修改,而不再需要數組的排序等操作,這種實(shí)現方法就能加快對其他局部區間數組的查找操作。這種方法的優(yōu)點(diǎn)就是即保存了數組的原有信息,又避免了多次查找中的多次排序問(wèn)題,采用一次排序的問(wèn)題解決了不同區間的數據查找操作。

總結如上,我的代碼實(shí)現如下,其中需要注意的是struct中的<操作符重載是必須的,且必須將其設置為const成員函數,不然編譯不能通過(guò),必須重載是因為排序過(guò)程中需要比較對象的大?。?/p>

#include
#include
#include
#include
#include

using namespace std;

template
struct node
{
T num;
int index;

/*該操作符重載是必須的,因為排序過(guò)程需要比較數值大小*/
bool operator<(const node &rhs)const
{
return num < rhs.num;
}

friend ostream &
operator<<(ostream &os, const node &_node)
{
os << _node.num << " " << _node.index;
return os;
}
};

template
node& zoomsort(vector > &array,
int left, int right, int k)
{
int i = 0;

assert((left <= right)
&& (right - left >= k - 1));

/*基于庫函數的排序算法*/
sort(array.begin(), array.end());

/*查找過(guò)程*/
for(i = 0; i < array.size(); ++ i)
{
if(array[i].index >= left
&& array[i].index <= right)
-- k;

if(k == 0)
break;
}
if(k == 0)
return array[i];
}

int main()
{
int i = 0;
int num = 0;
node anode;
vector > array;

for(i = 0; i < 10; ++ i)
{
cin >> num;
anode.num = num;
anode.index = i;

array.push_back(anode);
}

for(i = 0; i < 10; ++ i)
cout << array[i].num << " ";
cout << endl;

cout << "the 3rd num in 2 to 6: ";
cout << zoomsort(array, 2,6,3) << endl;
cout << "the 4th num in 1 to 7: ";
cout << zoomsort(array, 1,7,4) << endl;
cout << "the 4th num in 3 to 9: ";
cout << zoomsort(array, 3,9,4) << endl;

return 0;
}

雖然,找工作是挺打擊自己的,但是我相信會(huì )逐漸好起來(lái)的。



關(guān)鍵詞: 伴隨數組計數排

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>