小编Kno*_*the的帖子

使用线程进行奇数偶数打印

奇数偶数打印使用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)

java multithreading thread-safety

7
推荐指数
1
解决办法
1万
查看次数

生成非连续组合

我正在尝试创建一个生成器(迭代器支持执行下一个,也许在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_rx_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答案的原因 …

python algorithm combinations

6
推荐指数
1
解决办法
1022
查看次数