固定比例01环的均匀分布问题

01环的均匀分布:寻找最佳插入策略
本文探讨了如何在包含m个1的环中均匀地插入k个0,以达到最均匀的分布状态。研究发现,这个问题与特定函数H(x,n)的最大值紧密相关。当2^r成为大于3^n的第一个数时,H(x,n)取得最大值的条件包括:x1+x2+...xn=r,xi取1或2,并且1和2在向量x中的分布最为均匀。" 112407537,10544879,Bootstrap4布局技巧:卡片居中与响应式设计,"['前端开发', 'Bootstrap', 'CSS', 'HTML', '响应式布局']

描述:将k个0插入由m个1组成的环中(k<=m),使得得到的新的环尽可能的均匀

例如 k = 5, m = 8.
R1=[0000011111111] 明显不均匀
R2=[1010101010111] 稍微均匀,但是环中有连续的4个1
R3=[1011011010101] 比较均匀,但是环中11太密集
R4=[1011010110101] 最佳均匀方案


R1 简单的把0连续的插入环中,不均匀
R2 两个0中间用一个1隔开,最后却有连续的四个1,1的局部密度太大
R3 两个0中间用一个或两个1隔开,但是11的局部密度太大。
令a=11,R3=[a0a0a01010]
R4 是最优方案!
令a=11,R4=[a0a010a010]


从均匀性考虑:最后的方案中
1.不可能有两个相邻的0,因为k<=m,0少1多
2.连续的1的长度只能是 m/k or m/k + 1



还是以 k = 5, m = 8 为例,
首先将5个0和5个1配对,令b=01,这样还剩下三个1,问题变成把5个b插入3个1中的环中。
子问题出现了,而且递归结构应该是:
(5,8) -> (3,5) -> (2,3) -> (1,2) -> (0,1)


(k,m)=(0,1): A=[1]
(k,m)=(1,2): 一个0,两个1,任意方案都是一个方案,B=[1,1,0]
(k,m)=(2,3): 两个0,三个1,最佳方案,C=[1,0,1,0,1]
i)2个0和两个1配对,构成 10
ii)将方案B=[1,1,0]中的 1 用 10替换,0 用 1 替换,
于是得到了方案C=[1,0,1,0,1].
(k,m)=(3,5): 3个0,5个1,最佳方案,D=[1, 0, 1, 1, 0, 1, 1, 0]
同样,将方案C中的 1 用 10替换,0 用 1 替换,
于是得到了方案D.
(k,m)=(5,8): 5个0,8个1,最佳方案,
E=[1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1]


这种分配方法,和求最大公约数辗转相除法是一样的,能保证最后的结果的均匀性。
以下给出最优结果的一些例子:
(k,m)=(2,4):[1, 1, 0, 1, 1, 0]
(k,m)=(2,5):[1, 1, 0, 1, 1, 0, 1]
(k,m)=(2,7):[1, 1, 1, 0, 1, 1, 1, 0, 1]
(k,m)=(3,7):[1, 1, 0, 1, 1, 0, 1, 1, 0, 1]
(k,m)=(5,7):[1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0]


以下是python代码:

#!/usr/bin/python
import sys
from sys import argv
#------------------------------------------
def uniformly(k,m):
	if(k>m):return uniformly(m,k);
	ans = [];
	if(k==0):
		return [1]*m; # m ones
	res = uniformly(m%k,k);
	d = m/k;
	for i in res:
		if i==1:
			# 1 -> 1**10, append d ones and 1 zero
			ans = ans + [1]*d;
			ans.append(0);
		else:
			# 0 -> 1
			ans.append(1);
	return ans;
#------------------------------------------
def main():
	if len(sys.argv) > 2:
		k = int(sys.argv[1]);
		m = int(sys.argv[2]);
		print uniformly(k,m);
if __name__ == "__main__":
	print('-----------');
	main();
	print('-----------');



续:01环的均匀分布性和以下这个函数的最大值密切相关



对于给定的n,令 2^r 为第一个大于3^n的数,那么
函数H(x,n)取最大值 当且仅当 
i) x1 + x2 + ... xn = r
ii) xi = 1 or 2
iii) 向量x中的1和2分布是最均匀的

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值