【TS】两个列表之间的一些禁忌算子

一、从B到A的禁忌插入

A=[1+,2+,3-,4-,5+,6-,7+,8-]B=['a+','b+','c-','d-','e+']
A具有顺序要求,因此插入位置的不同,会导致插入结果的不同。
A具有端点的属性要求。A的首位置必须是+,A的末尾必须是-。

  1. 从B中取出首位置的元素a。
  2. 判断元素a是否属于tabo_remove【禁忌列表:表示从A到B移动的节点】
  3. 并判断元素的属性:+ or -/
  4. if +:随机选择从(0,len-1)的位置,插入
    if -:随机选择从(1,len)的位置,插入
  5. 将元素放入tabo_insert

二、从A到B的禁忌移除

A=[1+,2+,3-,4-,5+,6-,7+,8-]B=['a+','b+','c-','d-','e+']
A具有顺序要求,因此移除位置的不同,会导致移除结果的不同。
A具有端点的属性要求。A的首位置必须是+,A的末尾必须是-。
B不具有顺序要求,因此移除的节点直接添加到B的末尾即可。

  1. 对于第一个节点需要额外判断:第一个移除后,第二个节点是否可以承担首节点的要求,即要求属性为+
    2.对于最后一个节点需要额外判断:最后一个移除后,倒数第二个节点是否可以承担起尾节点的要求,即要求为-。
  2. 每个节点都应该检查是否属于tabo_insert【禁忌列表:从B插入到A的节点】
  3. 将移除的节点删除
  4. 在B后的末尾加入新节点

三、A与B的禁忌交换

A=[1+,2+,3-,4-,5+,6-,7+,8-]B=['a+','b+','c-','d-','e+']
A具有顺序要求,因此交换位置的不同,会导致交换结果的不同。
A具有端点的属性要求。A的首位置必须是+,A的末尾必须是-。
B不具有顺序要求,因此交换的节点直接添加到B的末尾即可。

  1. 对于A列表中随机选择一个交换位置index。
  2. if index==0:则在B中按照顺序选择一个+属性的节点。如果没有+属性,则重新选择交换位置。
  3. if index==len(A)-1:则在B中按照顺序选择一个-属性的节点。如果没有-属性,则重新选择交换位置。
  4. 其他的交换位置,则在B中按照顺序弹出一个即可。
  5. 先拿走A中的元素
  6. 拿出B中选择的元素,按照交换位置插入A
  7. 将A中拿走的元素在B的末尾插入。

四、列表A和列表B的禁忌配对

A=[1+,2+,3+,4+,5+,6+,7+,8+]B=['a-','b-','c-','d-','e-']
要从A中选择一个,再从B中选择一个,构成配对。该配对不能已经配过了。
此外A和B还会因为其他因素,导致元素减少。

  1. A1=A.copy(),B1=B.copy()
  2. 最糟糕的情况下为A=[1,8],B=[a,c]两两不成配对。
  3. 顺序从A1中选择第一个节点p

3.1 顺序从B1中选择节点d
3.2 if 判断d是否是p的禁忌
3.2.1 是:遍历B1的下一个节点。判断p,d是否为都为最后一个节点


3.2.2 否:if 判断(p,d)是否构成节点对
3.3.2.1 是:跳出选择配对环节
3.3.2.2 否: 将d记作p的禁忌,遍历B1的下一个节点。判断p,d是否都为最后一个节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值