奇数偶数打印使用thread.Create一个线程类,两个线程实例.一个将打印奇数,另一个将打印偶数.
我做了以下编码.但它涉及死锁状态.有人可以解释一下可能是什么原因吗?
public class NumberPrinter implements Runnable{
private String type;
private static boolean oddTurn=true;
public NumberPrinter(String type){
this.type=type;
}
public void run() {
int i=type.equals("odd")?1:2;
while(i<10){
if(type.equals("odd"))
printOdd(i);
if(type.equals("even"))
printEven(i);
i=i+2;
}
}
private synchronized void printOdd(int i){
while(!oddTurn){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(type + i);
oddTurn=false;
notifyAll();
}
private synchronized void printEven(int i){
while(oddTurn){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(type + i);
oddTurn=true;
notifyAll();
}
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个生成器(迭代器支持执行下一个,也许在python中使用yield),它给出了来自{1,2,... n}(n和r是参数)的r个元素的所有组合,以便在选中的r元素,没有两个是连续的.
例如,对于r = 2且n = 4
生成的组合是{1,3}, {1,4}, {2, 4}.
我可以生成所有组合(作为迭代器)并过滤那些不符合标准的组合,但我们将做不必要的工作.
是否存在一些生成算法,即nextO(1)(如果不可能,则为O(r)或O(n)).
返回集合的顺序不相关(并且希望允许O(1)算法).
注意:我已将其标记为python,但语言无关的算法也会有所帮助.
更新:
我找到了一种将它映射到生成纯组合的方法!网络搜索显示组合可能有O(1)(虽然看起来很复杂).
这是映射.
假设我们有一个组合x_1, x_2, ... , x_r与x_1 + 1 < x_2, x_2 + 1 < x_3, ...
我们映射y_1, y_2, ..., y_r如下
y_1 = x_1
y_2 = x_2 - 1
y_3 = x_3 - 2
...
y_r = x_r - (r-1)
Run Code Online (Sandbox Code Playgroud)
这样我们就y_1 < y_2 < y_3 ... 没有非连续约束!
这基本上等于从n-r + 1中选择r个元素.因此,我需要做的就是为(n-r + 1选择r)运行代.
出于我们的目的,在生成事物之后使用映射就足够了.
选择svkcr答案的原因 …