| 24小時(shí)熱門(mén)版塊排行榜 |
| 5 | 1/1 | 返回列表 |
| 查看: 1276 | 回復(fù): 4 | ||
[求助]
求高手幫忙修改一段c++程序
|
|
下面是一段建立K-D樹(shù)的c++程序,其中程序中的數(shù)據(jù)要修改為用讀入txt文件中的數(shù)據(jù)來(lái)表示,且txt文件中的數(shù)據(jù)為三列,以空格分割。 main.cpp #include "3dtree.h" #include #include void main() { time_t tt = time(NULL); //建立樹(shù) int nodes = 100000; kdTree t(nodes); //存儲(chǔ)數(shù)據(jù) t.store(1.0,1.0,1.0,0); t.store(1.0,2.0,1.0,1); t.store(2.0,4.0,5.0,2); t.store(3.0,1.0,2.0,3); t.store(4.0,6.0,2.0,4); t.store(1.0,5.0,8.0,5); //調(diào)整樹(shù) t.treeBalance(); //尋找最近臨點(diǎn) nNearestNodes nNN(3); nNN.setDistandIndx(4.3); nNN.setSearchPnt(2.0,4.0,5.0); cout << endl << "searching ..." << endl; t.locateNodes(&nNN,1); if(nNN.found) for(int i = 1; i <= nNN.found; i++) { cout < < "id of the nearest point: " << nNN.index->id < < endl < < "the dis: " < < nNN.dist2 << endl; cout < < "the coordinates of the point:"; cout < < nNN.index->pos[0] < < " " < < nNN.index->pos[1] < < " " < < nNN.index->pos[2] < < endl < < endl; } else cout << "Nothing found!" << endl << endl; cout<<"run time:"< system("pause" ;} 3dtree.cpp #include "3dtree.h" kdTree::kdTree(const int nodes) { storedKDNodes = 0; maxNumOfNodes = nodes; kdNodes = new kdNode[maxNumOfNodes + 1]; if(!kdNodes) { cout<<"初始化kd樹(shù)時(shí)內(nèi)存溢出!"< } boundrayMin[0] = boundrayMin[1] = boundrayMin[2] = 1e8f; boundrayMax[0] = boundrayMax[1] = boundrayMax[2] = -1e8f; } kdTree::~kdTree() { delete [] kdNodes; } void kdTree::treeBalance() { if(storedKDNodes > 1) { kdNode **pa1 = new kdNode*[storedKDNodes + 1]; //組織好樹(shù)后的指針 kdNode **pa2 = new kdNode*[storedKDNodes + 1]; //原始元素的指針 for(int i =0; i <= storedKDNodes; i++) pa2 = &kdNodes; balancePartition(pa1, pa2, 1, 1, storedKDNodes); delete []pa2; //重新排列樹(shù) //__w64 int d, j = 1; // According to the warning given when 'int ' is used int d, j = 1; //j位置元素已經(jīng)轉(zhuǎn)移走 int foo = 1; //fooNodes存儲(chǔ)的元素的最初位置 kdNode fooNodes = kdNodes[j]; for( int i = 1; i <= storedKDNodes; i++) { d = pa1[j] - kdNodes; pa1[j] = NULL; if(d != foo) kdNodes[j] = kdNodes[d]; else { kdNodes[j] = fooNodes; if(i < storedKDNodes) { for(; foo <= storedKDNodes; foo++) if(NULL != pa1[foo]) break; fooNodes = kdNodes[foo]; j = foo; } continue; } j = d; } delete []pa1; } halfStoredKDNodes = storedKDNodes/2 - 1; } void kdTree::locateNodes(nNearestNodes * const nNN,const int index)const { const kdNode *p = &kdNodes[index]; double dist1; if(index < halfStoredKDNodes) { dist1 = nNN->pos[p->plane] - p->pos[p->plane]; if(0.0 < dist1) { locateNodes(nNN, 2 * index + 1); if(nNN->dist2[0] > dist1 * dist1) locateNodes(nNN, 2 * index); } else { locateNodes(nNN, 2 * index); if(nNN->dist2[0] > dist1 * dist1) locateNodes(nNN, 2 * index + 1); }//if }//if // 計(jì)算距離 dist1 = p->pos[0] - nNN->pos[0]; double dist2 = dist1 * dist1; dist1 = p->pos[1] - nNN->pos[1]; dist2 += dist1 * dist1; dist1 = p->pos[2] - nNN->pos[2]; dist2 += dist1 * dist1; if(nNN->dist2[0] > dist2) { if(nNN->found < nNN->max) { nNN->found++; nNN->dist2[nNN->found] = dist2; nNN->index[nNN->found] = p; } else { int j, parent; if(0 == nNN->got_Heap)//建立大頂堆 { double dst2; const kdNode *nd; int halfFound = nNN->found >> 1; for(int k = halfFound; k >= 1; k--) { parent = k; nd = nNN->index[k]; dst2 = nNN->dist2[k]; while(parent <= halfFound) { j = parent + parent; if(j < nNN->found && nNN->dist2[j] < nNN->dist2[j + 1]) j ++; if(dst2 >= nNN->dist2[j]) break; nNN->dist2[parent] = nNN->dist2[j]; nNN->index[parent] = nNN->index[j]; parent = j; }//while nNN->dist2[parent] = dst2; nNN->index[parent] = nd; }//for nNN->got_Heap = 1; }//if //插入 parent = 1; //if() j = 2; while(j <= nNN->found) { if(j < nNN->found && nNN->dist2[j] < nNN->dist2[j + 1]) j++; if(dist2 > nNN->dist2[j]) break; nNN->dist2[parent] = nNN->dist2[j]; nNN->index[parent] = nNN->index[j]; parent = j; j += j; }//while if((parent != 1)||(dist2 < nNN->dist2[parent])) { nNN->index[parent] = p; nNN->dist2[parent] = dist2; } nNN->dist2[0] = nNN->dist2[1];//?????? }//else }//if } #define swap(kdN,a,b){ kdNode* tmp = kdN[a]; kdN[a] = kdN; kdN = tmp;} void kdTree::medianPartition(kdNode** pOrig,const int start,const int end,const int median,const int axis) { int left = start; int right = end; while(right > left) { const TYPE v = pOrig[right]->pos[axis]; int i = left - 1; int j = right; for(; ![]() { while(pOrig[++i]->pos[axis] < v); while(pOrig[--j]->pos[axis] > v && j > left); if(i >= j) break; swap(pOrig, i, j); } swap(pOrig, i, right); if(i >= median) right = i - 1; if(i <= median) left = i + 1; } } void kdTree::balancePartition(kdNode** pBalanced,kdNode** pOriginal,const int index,const int start,const int end) { //計(jì)算median,這是怎么計(jì)算的呢??? int median = 1; while((4 * median) <= (end - start + 1)) median += median; //median*=2; if((3 * median) <= (end - start +1)) { median += median; median += start - 1; } else median = end - median + 1; // 尋找分割數(shù)據(jù)的軸 int axis = 2; if((boundrayMax[0] - boundrayMin[0]) > (boundrayMax[1] - boundrayMin[1])&& (boundrayMax[0] - boundrayMin[0]) > (boundrayMax[2] - boundrayMin[2])) axis = 0; else if((boundrayMax[1] - boundrayMin[1]) > (boundrayMax[2] - boundrayMin[2])) axis = 1; // 按median分割節(jié)點(diǎn) medianPartition(pOriginal, start, end, median, axis); pBalanced[index] = pOriginal[median]; pBalanced[index]->plane = axis; // 迭代平衡左右子樹(shù) if(median > start) { if(start < median - 1) { const float tmp = boundrayMax[axis]; boundrayMax[axis] = pBalanced[index]->pos[axis]; balancePartition(pBalanced, pOriginal, 2 * index, start, median - 1); boundrayMax[axis] = tmp; } else pBalanced[2 * index] = pOriginal[start]; } if(median < end) { if(median + 1 < end) { const float tmp = boundrayMin[axis]; boundrayMin[axis] = pBalanced[index]->pos[axis]; balancePartition(pBalanced, pOriginal, 2 * index + 1, median + 1, end); boundrayMin[axis] = tmp; } else pBalanced[2 * index + 1] = pOriginal[end]; } } [ Last edited by lxb9721 on 2012-7-2 at 20:27 ] |
至尊木蟲(chóng) (著名寫(xiě)手)
驃騎將軍

新蟲(chóng) (初入文壇)
|
本帖內(nèi)容被屏蔽 |
木蟲(chóng) (正式寫(xiě)手)

| 5 | 1/1 | 返回列表 |
| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 本2一志愿C9-333分,材料科學(xué)與工程,求調(diào)劑 +5 | 升升不降 2026-03-31 | 5/250 |
|
|---|---|---|---|---|
|
[考研] 085601一志愿中山大學(xué)深圳材料工程330求調(diào)劑 +5 | pipiver 2026-03-30 | 5/250 |
|
|
[考研] 284求調(diào)劑 +3 | 小熊~~ 2026-03-31 | 3/150 |
|
|
[考研] 311求調(diào)劑一志愿合肥工業(yè)大學(xué) +5 | 秋二十二 2026-03-30 | 5/250 |
|
|
[考研] 哈爾濱工業(yè)大學(xué)材料與化工專(zhuān)碩378求調(diào)劑 +3 | 塔比烏斯 2026-03-30 | 3/150 |
|
|
[考研] 調(diào)劑 +4 | GK72 2026-03-30 | 4/200 |
|
|
[考研] 359求調(diào)劑 +5 | 王了個(gè)楠 2026-03-25 | 5/250 |
|
|
[考研] 309求調(diào)劑 +15 | 誰(shuí)不是少年 2026-03-29 | 15/750 |
|
|
[考研] 一志愿南開(kāi)大學(xué)0710生物學(xué)359求調(diào)劑 +5 | 兔兔兔111223314 2026-03-29 | 7/350 |
|
|
[考研] 085701求調(diào)劑初試286分 +5 | secret0328 2026-03-28 | 5/250 |
|
|
[考研] 311求調(diào)劑 +10 | lin0039 2026-03-26 | 10/500 |
|
|
[考研] 290求調(diào)劑 +3 | dfffsar 2026-03-29 | 3/150 |
|
|
[考研]
|
nnnnnnn5 2026-03-25 | 11/550 |
|
|
[考研] 305求調(diào)劑 +8 | RuiFairyrui 2026-03-28 | 8/400 |
|
|
[考研] 085602 307分 求調(diào)劑 +7 | 不知道叫什么! 2026-03-26 | 7/350 |
|
|
[考研] 一志愿上海理工能源動(dòng)力(085800)310分求調(diào)劑 +3 | zhangmingc 2026-03-27 | 4/200 |
|
|
[考研] 085600,材料與化工321分調(diào)劑 +4 | 大饞小子 2026-03-27 | 6/300 |
|
|
[考研] 機(jī)械學(xué)碩310分,數(shù)一英一,一志愿211本科雙非找調(diào)劑信息 +3 | @357 2026-03-25 | 3/150 |
|
|
[考研] 【2026考研調(diào)劑】制藥工程 284分 求相關(guān)專(zhuān)業(yè)調(diào)劑名額 +4 | 袁奐奐 2026-03-25 | 8/400 |
|
|
[考研] 材料專(zhuān)碩331求調(diào)劑 +4 | 鮮當(dāng)牛 2026-03-24 | 4/200 |
|