| 查看: 1198 | 回复: 4 | |||
[求助]
求高手帮忙修改一段c++程序
|
|
下面是一段建立K-D树的c++程序,其中程序中的数据要修改为用读入txt文件中的数据来表示,且txt文件中的数据为三列,以空格分割。 main.cpp #include "3dtree.h" #include #include void main() { time_t tt = time(NULL); //建立树 int nodes = 100000; kdTree t(nodes); //存储数据 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); //调整树 t.treeBalance(); //寻找最近临点 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树时内存溢出!"< } 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]; //组织好树后的指针 kdNode **pa2 = new kdNode*[storedKDNodes + 1]; //原始元素的指针 for(int i =0; i <= storedKDNodes; i++) pa2 = &kdNodes; balancePartition(pa1, pa2, 1, 1, storedKDNodes); delete []pa2; //重新排列树 //__w64 int d, j = 1; // According to the warning given when 'int ' is used int d, j = 1; //j位置元素已经转移走 int foo = 1; //fooNodes存储的元素的最初位置 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 // 计算距离 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) { //计算median,这是怎么计算的呢??? 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; // 寻找分割数据的轴 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分割节点 medianPartition(pOriginal, start, end, median, axis); pBalanced[index] = pOriginal[median]; pBalanced[index]->plane = axis; // 迭代平衡左右子树 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 ] |
» 猜你喜欢
上海工程技术大学【激光智能制造】课题组招收硕士
已经有6人回复
带资进组求博导收留
已经有11人回复
自荐读博
已经有5人回复
求个博导看看
已经有16人回复
上海工程技术大学张培磊教授团队招收博士生
已经有4人回复
求助院士们,这个如何合成呀
已经有4人回复
临港实验室与上科大联培博士招生1名
已经有9人回复
写了一篇“相变储能技术在冷库中应用”的论文,论文内容以实验为主,投什么期刊合适?
已经有6人回复
最近几年招的学生写论文不引自己组发的文章
已经有11人回复
中科院杭州医学所招收博士生一名(生物分析化学、药物递送)
已经有3人回复
» 本主题相关价值贴推荐,对您同样有帮助:
求助高手帮忙翻译一小段英文!!!
已经有1人回复
请求高手帮忙翻译一段德文(不是很长,不超过150个词)
已经有9人回复
求高手帮忙翻译一段英文,要通顺,不要谷歌翻译之类的!
已经有3人回复
求助图片修改,高手帮忙
已经有4人回复
求高手帮忙改一下英文摘要
已经有12人回复
【求助】求将c语言改写为C++,求教高人啊!
已经有6人回复
【求助】高手帮看看这段C++代码
已经有4人回复
【求助】求高手帮忙改写数据实时动态显示程序~
已经有8人回复
【求助】求c++编一个简单计算器的源代码
已经有6人回复
【交流】VC++, C#, VB答疑专贴
已经有145人回复
libralibra
至尊木虫 (著名写手)
骠骑将军
- 程序强帖: 40
- 应助: 817 (博后)
- 金币: 12914.1
- 红花: 64
- 帖子: 2238
- 在线: 287.3小时
- 虫号: 696514
- 注册: 2009-02-05
- 专业: 计算机软件

2楼2012-07-02 20:49:24
3楼2012-07-02 21:03:23
★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
lxb9721: 金币+10, ★★★很有帮助, http://emuch.net/bbs/viewthread.php?tid=4698994 2012-07-05 20:38:46
感谢参与,应助指数 +1
lxb9721: 金币+10, ★★★很有帮助, http://emuch.net/bbs/viewthread.php?tid=4698994 2012-07-05 20:38:46
|
本帖内容被屏蔽 |
4楼2012-07-02 21:59:18
菩提色
木虫 (正式写手)
- 应助: 13 (小学生)
- 金币: 1592.9
- 红花: 1
- 帖子: 581
- 在线: 67.4小时
- 虫号: 1735005
- 注册: 2012-04-03
- 性别: GG
- 专业: 自然语言理解与机器翻译

5楼2012-07-03 20:46:23







;
回复此楼