Data structures 用于查找删除/更新后的最小值的数据结构建议
我希望得到一个C/C++数据结构的建议,以处理以下问题: 假设在数组/链表中存储了一系列点(a、B、C、D、…N),每个点都有一个与之关联的值(a-val、B-val…)。每个点的值部分取决于其左侧和右侧的紧邻。因此,A-val依赖于N和B,B-val依赖于A和C,等等。因此,排序问题。此外,两个点可以具有相同的val(即,A-val可以等于B-val) 指定初始值后,找到具有最小val的点,将其删除,并更新以前与左邻居和右邻居(现在是邻居)关联的val。因此,如果B具有最小的val,您将删除B,更新A-val(现在取决于C)并更新C-val(现在取决于A)。A和C的新val可能彼此不同,更高、更低或与已删除点B的val相同,更高、更低或与其以前的val相同。例如,C-val的变化不会导致D-val的变化。因此,删除只会影响先前点的左右邻域,而不会影响其他点。重复此过程,直到最小值大于某个任意数 这样做的一种方法是每次只查看整个列表,寻找最小的val。虽然这种方法有效,但当N较大(例如1000)且您的任意数字意味着只有~100个点可以存活时,速度较慢且接近O(N^2) 我正在考虑维护一个单独的VAL列表和按VAL排序的点。但我不知道如何更新此列表,或者可能以多种方式对同一列表进行排序Data structures 用于查找删除/更新后的最小值的数据结构建议,data-structures,Data Structures,我希望得到一个C/C++数据结构的建议,以处理以下问题: 假设在数组/链表中存储了一系列点(a、B、C、D、…N),每个点都有一个与之关联的值(a-val、B-val…)。每个点的值部分取决于其左侧和右侧的紧邻。因此,A-val依赖于N和B,B-val依赖于A和C,等等。因此,排序问题。此外,两个点可以具有相同的val(即,A-val可以等于B-val) 指定初始值后,找到具有最小val的点,将其删除,并更新以前与左邻居和右邻居(现在是邻居)关联的val。因此,如果B具有最小的val,您将删除
感谢您的建议。我认为这应该是定制的,因为1)排序、2)访问和链接任意位置、3)重复值的组合 思想
struct{
int-val;
共享_ptr左;
共享ptr权;
}我的结构;
映射我的数据;
使用此设置,您可以:
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
结构mystruct{
int-val;
共享_ptr左;
共享ptr权;
mystruct(int val,shared_ptr left,shared_ptr right):val(val),left(left),right(right){
};
映射我的数据;
int main(){
//****开始创建和显示假数据****
//一些随机值是我用手指挑出来的,重复了几次
向量某些_值={0,45,2,34,5,2,3,5,67,2};
//创建初始数据结构
首先创建共享的_ptr(新的mystruct(一些_值[0],NULL,NULL));
mydata[某些值[0]]。插入(创建的第一个值);//第一个值
shared_ptr left=第一个创建的_;
对于(int i=1;i右=新创建的;
左=新创建的;
}
左->右=第一个\u已创建;//连接第一个和最后一个
创建第一个->左=左;//连接第一个和最后一个
//健康检查
printf(“初始条件”);
用于(自动it:mydata){
for(自动地址:it.second){
printf(“%d addr=0x%p left=0x%p(%d)right=0x%p(%d)\n”,它。首先,addr.get(),addr->left.get(),addr->left->val,addr->right.get(),addr->right->val);
}
}
//****结束创建和显示虚假数据****
//****使用VAL第一个,mydata.size());
用于(自动it:mydata){
for(自动地址:it.second){
int leftval=(addr->left.get()==nullptr)?0:addr->left->val;
int rightval=(addr->right.get()==nullptr)?0:addr->right->val;
printf(“%d addr=0x%p left=0x%p(%d)right=0x%p(%d)\n”,它。首先,addr.get(),addr->left.get(),leftval,addr->right.get(),rightval);
}
}
如果(it->first>=停止){
printf(“停止,因为第一个键(%d)大于等于%d(停止值)\n”,它->第一个,停止);
打破
}
if(it->second.empty()){
printf(“哎哟-我们有一个空集!(这永远不会发生)\n”);
打破
}
//好的,别紧张,我们会抓到第一个人的
shared_ptr deleteMe=*(it->second.begin());
//1)查找左侧和右侧。删除仅影响
Initial Conditions
0 addr=0x0x55af1c01aee0 left=0x0x55af1c01b690 (2) right=0x0x55af1c01afd0 (45)
2 addr=0x0x55af1c01b0c0 left=0x0x55af1c01afd0 (45) right=0x0x55af1c01b1b0 (34)
2 addr=0x0x55af1c01b390 left=0x0x55af1c01b2a0 (5) right=0x0x55af1c01b420 (3)
2 addr=0x0x55af1c01b690 left=0x0x55af1c01b5a0 (67) right=0x0x55af1c01aee0 (0)
3 addr=0x0x55af1c01b420 left=0x0x55af1c01b390 (2) right=0x0x55af1c01b510 (5)
5 addr=0x0x55af1c01b2a0 left=0x0x55af1c01b1b0 (34) right=0x0x55af1c01b390 (2)
5 addr=0x0x55af1c01b510 left=0x0x55af1c01b420 (3) right=0x0x55af1c01b5a0 (67)
34 addr=0x0x55af1c01b1b0 left=0x0x55af1c01b0c0 (2) right=0x0x55af1c01b2a0 (5)
45 addr=0x0x55af1c01afd0 left=0x0x55af1c01aee0 (0) right=0x0x55af1c01b0c0 (2)
67 addr=0x0x55af1c01b5a0 left=0x0x55af1c01b510 (5) right=0x0x55af1c01b690 (2)
First key = 0 size=7
0 addr=0x0x55af1c01aee0 left=0x0x55af1c01b690 (2) right=0x0x55af1c01afd0 (45)
2 addr=0x0x55af1c01b0c0 left=0x0x55af1c01afd0 (45) right=0x0x55af1c01b1b0 (34)
2 addr=0x0x55af1c01b390 left=0x0x55af1c01b2a0 (5) right=0x0x55af1c01b420 (3)
2 addr=0x0x55af1c01b690 left=0x0x55af1c01b5a0 (67) right=0x0x55af1c01aee0 (0)
3 addr=0x0x55af1c01b420 left=0x0x55af1c01b390 (2) right=0x0x55af1c01b510 (5)
5 addr=0x0x55af1c01b2a0 left=0x0x55af1c01b1b0 (34) right=0x0x55af1c01b390 (2)
5 addr=0x0x55af1c01b510 left=0x0x55af1c01b420 (3) right=0x0x55af1c01b5a0 (67)
34 addr=0x0x55af1c01b1b0 left=0x0x55af1c01b0c0 (2) right=0x0x55af1c01b2a0 (5)
45 addr=0x0x55af1c01afd0 left=0x0x55af1c01aee0 (0) right=0x0x55af1c01b0c0 (2)
67 addr=0x0x55af1c01b5a0 left=0x0x55af1c01b510 (5) right=0x0x55af1c01b690 (2)
First key = 2 size=6
2 addr=0x0x55af1c01b0c0 left=0x0x55af1c01afd0 (45) right=0x0x55af1c01b1b0 (34)
2 addr=0x0x55af1c01b390 left=0x0x55af1c01b2a0 (5) right=0x0x55af1c01b420 (3)
2 addr=0x0x55af1c01b690 left=0x0x55af1c01b5a0 (67) right=0x0x55af1c01afd0 (45)
3 addr=0x0x55af1c01b420 left=0x0x55af1c01b390 (2) right=0x0x55af1c01b510 (5)
5 addr=0x0x55af1c01b2a0 left=0x0x55af1c01b1b0 (34) right=0x0x55af1c01b390 (2)
5 addr=0x0x55af1c01b510 left=0x0x55af1c01b420 (3) right=0x0x55af1c01b5a0 (67)
34 addr=0x0x55af1c01b1b0 left=0x0x55af1c01b0c0 (2) right=0x0x55af1c01b2a0 (5)
45 addr=0x0x55af1c01afd0 left=0x0x55af1c01b690 (2) right=0x0x55af1c01b0c0 (2)
67 addr=0x0x55af1c01b5a0 left=0x0x55af1c01b510 (5) right=0x0x55af1c01b690 (2)
First key = 2 size=6
2 addr=0x0x55af1c01b390 left=0x0x55af1c01b2a0 (5) right=0x0x55af1c01b420 (3)
2 addr=0x0x55af1c01b690 left=0x0x55af1c01b5a0 (67) right=0x0x55af1c01afd0 (46)
3 addr=0x0x55af1c01b420 left=0x0x55af1c01b390 (2) right=0x0x55af1c01b510 (5)
5 addr=0x0x55af1c01b2a0 left=0x0x55af1c01b1b0 (35) right=0x0x55af1c01b390 (2)
5 addr=0x0x55af1c01b510 left=0x0x55af1c01b420 (3) right=0x0x55af1c01b5a0 (67)
35 addr=0x0x55af1c01b1b0 left=0x0x55af1c01afd0 (46) right=0x0x55af1c01b2a0 (5)
46 addr=0x0x55af1c01afd0 left=0x0x55af1c01b690 (2) right=0x0x55af1c01b1b0 (35)
67 addr=0x0x55af1c01b5a0 left=0x0x55af1c01b510 (5) right=0x0x55af1c01b690 (2)
First key = 2 size=7
2 addr=0x0x55af1c01b690 left=0x0x55af1c01b5a0 (67) right=0x0x55af1c01afd0 (46)
4 addr=0x0x55af1c01b420 left=0x0x55af1c01b2a0 (6) right=0x0x55af1c01b510 (5)
5 addr=0x0x55af1c01b510 left=0x0x55af1c01b420 (4) right=0x0x55af1c01b5a0 (67)
6 addr=0x0x55af1c01b2a0 left=0x0x55af1c01b1b0 (35) right=0x0x55af1c01b420 (4)
35 addr=0x0x55af1c01b1b0 left=0x0x55af1c01afd0 (46) right=0x0x55af1c01b2a0 (6)
46 addr=0x0x55af1c01afd0 left=0x0x55af1c01b690 (2) right=0x0x55af1c01b1b0 (35)
67 addr=0x0x55af1c01b5a0 left=0x0x55af1c01b510 (5) right=0x0x55af1c01b690 (2)
First key = 4 size=6
4 addr=0x0x55af1c01b420 left=0x0x55af1c01b2a0 (6) right=0x0x55af1c01b510 (5)
5 addr=0x0x55af1c01b510 left=0x0x55af1c01b420 (4) right=0x0x55af1c01b5a0 (68)
6 addr=0x0x55af1c01b2a0 left=0x0x55af1c01b1b0 (35) right=0x0x55af1c01b420 (4)
35 addr=0x0x55af1c01b1b0 left=0x0x55af1c01afd0 (47) right=0x0x55af1c01b2a0 (6)
47 addr=0x0x55af1c01afd0 left=0x0x55af1c01b5a0 (68) right=0x0x55af1c01b1b0 (35)
68 addr=0x0x55af1c01b5a0 left=0x0x55af1c01b510 (5) right=0x0x55af1c01afd0 (47)
First key = 7 size=5
7 addr=0x0x55af1c01b510 left=0x0x55af1c01b2a0 (8) right=0x0x55af1c01b5a0 (68)
8 addr=0x0x55af1c01b2a0 left=0x0x55af1c01b1b0 (35) right=0x0x55af1c01b510 (7)
35 addr=0x0x55af1c01b1b0 left=0x0x55af1c01afd0 (47) right=0x0x55af1c01b2a0 (8)
47 addr=0x0x55af1c01afd0 left=0x0x55af1c01b5a0 (68) right=0x0x55af1c01b1b0 (35)
68 addr=0x0x55af1c01b5a0 left=0x0x55af1c01b510 (7) right=0x0x55af1c01afd0 (47)
First key = 11 size=4
11 addr=0x0x55af1c01b2a0 left=0x0x55af1c01b1b0 (35) right=0x0x55af1c01b5a0 (71)
35 addr=0x0x55af1c01b1b0 left=0x0x55af1c01afd0 (47) right=0x0x55af1c01b2a0 (11)
47 addr=0x0x55af1c01afd0 left=0x0x55af1c01b5a0 (71) right=0x0x55af1c01b1b0 (35)
71 addr=0x0x55af1c01b5a0 left=0x0x55af1c01b2a0 (11) right=0x0x55af1c01afd0 (47)
First key = 40 size=3
40 addr=0x0x55af1c01b1b0 left=0x0x55af1c01afd0 (47) right=0x0x55af1c01b5a0 (76)
47 addr=0x0x55af1c01afd0 left=0x0x55af1c01b5a0 (76) right=0x0x55af1c01b1b0 (40)
76 addr=0x0x55af1c01b5a0 left=0x0x55af1c01b1b0 (40) right=0x0x55af1c01afd0 (47)
First key = 67 size=2
67 addr=0x0x55af1c01afd0 left=0x0x55af1c01b5a0 (96) right=0x0x55af1c01b5a0 (96)
96 addr=0x0x55af1c01b5a0 left=0x0x55af1c01afd0 (67) right=0x0x55af1c01afd0 (67)
First key = 129 size=1
129 addr=0x0x55af1c01b5a0 left=0x(nil) (0) right=0x(nil) (0)
Ran out of data!
Results