Data structures 用于查找删除/更新后的最小值的数据结构建议

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,您将删除

我希望得到一个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排序的点。但我不知道如何更新此列表,或者可能以多种方式对同一列表进行排序


感谢您的建议。

我认为这应该是定制的,因为1)排序、2)访问和链接任意位置、3)重复值的组合

思想

  • 您希望以低廉的价格获得最低的价值
  • 您需要廉价的插入和删除,同时保持顺序
  • 您希望能够通过对象的值或地址引用对象
  • 我将创建一个结构,然后将值映射到一组指向mystruct的共享指针:

    struct{
    int-val;
    共享_ptr左;
    共享ptr权;
    }我的结构;
    映射我的数据;
    
    使用此设置,您可以:

  • 找到O(1)中的最小值
  • 查找O(1)中值最低的第一个节点
  • 在O(1)中查找节点的邻居
  • 在O(logN)中查找包含每个邻居的集合
  • 在O(logN)中插入和删除集合
  • 因此,删除一个节点+更新其值+保持排序顺序的总时间:O(logN)

    映射是有序的,所以您只需抓取第一个键即可获得最低值(或检测空映射)。我认为这只会导致在插入或删除一个新的映射时对映射的键进行排序,这是您所能做的最好的事情,因为您不能使用堆,也不能保证邻居的值彼此相关

    这里有一个问题/顾虑:如果你想删除最低的,哪一个重要??我使用的是一个集合,但是如果顺序很重要,你可能想把它换成一个向量,然后从它的开头/结尾删除

    下面是我为其编写的(有点难看的)概念验证脚本:

    #包括
    #包括
    #包括
    #包括
    #包括
    使用名称空间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