我确定有一个帖子,但我找不到一个问这个确切的问题.考虑以下:
假设我们有一些句子,例如"你好我的名字是汤姆","他的名字是杰里","他去没有水的地方".如果单词存在,我们检查哈希表.如果没有,我们为它分配一个唯一的id并将其放在哈希表中.这样,我们可以只有一个uniqueID列表,而不是将一串"单词"存储为一串字符串.
在上面,我们将具有例如(0,1,2,3,4),(5,2,3,6)和(7,8,9,10,3,11,12).请注意,3是"is",我们在发现新单词时添加了新的唯一ID.所以说我们得到一个句子"她的名字是",这将是(13,2,3).在这个背景下,我们想知道下一个词应该是什么.这是我想到的算法,但我认为它没有效率:
算法:
首先扫描包含完整S输入的链的整个链表(在本例中为13,2,3).由于我们必须扫描N个链,每个长度为M,并且每次比较S个字母,其O(N*M*S).
如果我们的扫描中没有链条具有完整的S,则通过删除最不重要的单词(即第一个单词,然后删除13)进行下一次扫描.现在,扫描(2,3),如在最坏情况下为1(O*N*M*S),这实际上是S-1.
继续扫描,直到我们得到结果> 0(如果有的话).
记下我们收集的所有剩余链中的下一个词.我们可以使用哈希表,每次添加时都会对其进行计数,并跟踪最多添加的单词.O(N)最坏情况构建,O(1)找到最大字.
每次扫描都采用O(M*N*S)最差情况.这是因为有N个链,每个链都有M个数字,我们必须检查S个数字以覆盖匹配.我们扫描最坏情况的S次(13,2,3,然后是2,3,然后3次扫描= S).因此,总复杂度为O(S ^ 2*M*N).
因此,如果我们有100,000个链并且平均句子长度为10个单词,我们会查看1,000,000*S ^ 2以获得最佳单词.显然,N >> M,因为句子长度一般不随着观察句子的数量而缩放,所以M可以是常数.然后我们可以将复杂度降低到O(S ^ 2*N).然而,O(S ^ 2*M*N)可能对分析更有帮助,因为M可以是相当大的"常数".
对于这类问题,这可能是完全错误的方法,但我想分享我的想法而不是公然要求协助.我扫描我的方式的原因是因为我只想尽可能多地扫描.如果没有完整的S,只需保持修剪S直到某些链匹配.如果他们永远不匹配,我们不知道下一个词会预测什么!关于更少时间/空间复杂解决方案的任何建议?谢谢!
对不起,如果这是非常明显或已在其他地方回答.我找不到任何东西.我有以下代码:
public class SimpleThread extends Thread {
public static Integer sharedVal = 0;
public SimpleThread() {
}
@Override
public void run() {
while(true) {
iterator();
}
}
public void theSleeper() {
System.out.println("Thread: " + this.getId() + " is going to sleep!");
try {
this.sleep(5000);
} catch(Exception e) {
}
}
public void iterator() {
synchronized(sharedVal) {
System.out.println("Iterating sharedVal in thread: " + this.getId());
sharedVal++;
System.out.println(sharedVal);
theSleeper();
System.out.println("Thread : " + getId() + " is done sleeping, trying to iterate again..."); …
Run Code Online (Sandbox Code Playgroud) 我在C#中制作的游戏中遇到了一个问题.这是一个简单的基于磁贴的匹配游戏,问题出现在我试图制造的电源上:
假设我们有基本的瓷砖类型,圆形正方形和菱形,它们都是瓷砖的子类.我试图将"匹配"行为提取到抽象的Tile方法,而不是让圈子只与圈子匹配:canMatchWith(Tile t).Tiles还有两种方法来添加/删除它们可以匹配的Tiles.
所以说我们在游戏中间有一个圆形瓷砖,我们有一个补充说"圆形瓷砖本回合可以与方形瓷砖匹配".我将浏览所有Circle图块并说出circleTile.addCanMatchWith(typeof(Square)).在内部,我们有一个List canMatchWith.
然后,我想说"圆圈不能再与正方形匹配",只需说circleTile.removeCanMatchWith(typeOf(Square)).
这是我目前的解决方案,并且它很好用,没有我注意到的性能缺陷(这是一个基于区块的匹配游戏,所以这些类型每个'移动'只评估一次,而不是逐帧评估).然而,我脑中的声音告诉我,这是完成这种行为的一种不好的方法.所以我有一些选择:
这里的问题是冗余,我的枚举现在也有OVAL和ELIPSE,并且Elipse类将具有(CIRCLE,OVAL,ELIPSE TileTypes)作为它可以匹配的类型.这完全是多余的,我想只说"Circle",我可以用类型.我想Tiles可以有TileType baseType和TileType actualType.
总之,我想要实现的是让多个对象类型能够与任意数量的不同类型进行交互.问题是,我应该为Type使用什么.可以在这里使用GetType吗?枚举?或者有人会推荐更好的策略吗?我试图尽可能通用,这些磁贴不应该在其他磁贴上有任何硬编码依赖,并且必须能够在运行时更改他们可以与之交互的人.假设我创建了一个新的Tile子类,五角形......好吧,Pentagons可以与Squares,Circles和Pentagons匹配.我的实现很简单,但有些东西告诉我这是一个肮脏的OOP练习.
我觉得我必须使用Types/Enums,因为我不是想说这个Tile.addCanMatch(Tile someOtherObject).这太具体了,我希望thisTile能够与作为特定类的实例的所有tile匹配.
我开始玩Pyspark来做一些数据处理.我很有意思,我可以做类似的事情
rdd.map(lambda x : (x['somekey'], 1)).reduceByKey(lambda x,y: x+y).count()
Run Code Online (Sandbox Code Playgroud)
并且它会将这些函数中的逻辑发送到可能众多的机器上以并行执行.
现在,来自Java背景,如果我想将包含某些方法的对象发送到另一台机器,那么该机器需要知道通过网络流式传输的对象的类定义.最近java有了Functional Interfaces的想法,它会在编译时为我创建该接口的实现(即MyInterface impl =() - > System.out.println("Stuff");)
MyInterface只有一个方法,'doStuff()'
但是,如果我想通过线路发送这样的函数,目标机器需要知道实现(impl本身)才能调用它的'doStuff()'方法.
我的问题归结为......用Scala编写的Spark如何实际向其他机器发送功能?我有几个人:
谢谢!
编辑:Spark是用Scala编写的,但我有兴趣听听如何在Java中解决这个问题(除非它在一个类中,否则函数不能存在,从而改变需要在工作节点上更新的类定义).
编辑2:这是java中的问题,如果出现混淆:
public class Playground
{
private static interface DoesThings
{
public void doThing();
}
public void func() throws Exception {
Socket s = new Socket("addr", 1234);
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject("Hello!"); // Works just fine, you're just sending a string
oos.writeObject((DoesThings)()->System.out.println("Hey, im doing a thing!!")); // Sends the object, but error on other machine
DoesThings dt …
Run Code Online (Sandbox Code Playgroud) 目前我正在尝试让 java 按住如下键:
Robot rob;
rob.keyPress(KeyEvent.VK_ENTER);
Thread.sleep(3000);
rob.keyRelease(KeyEvent.VK_ENTER);
Run Code Online (Sandbox Code Playgroud)
这应该按住 Enter 键 3 秒,在一秒左右后导致重复效果。换句话说,如果您手动按住“r”键,它会首先键入 r,然后大约一秒钟后它会像 rrrrrrrr 一样。我想要机器人的这种效果。我也尝试过:
curTime = System.currentTimeMillis();
while(System.currentTimeMillis() - curTime < duration)
{
rob.keyPress(whatever);
}
rob.keyRelease(whatever);
Run Code Online (Sandbox Code Playgroud)
然而,这是极其敏感的,持续时间为 1 秒的输出……好吧,你的计算机在 1 秒内可以输出尽可能多的内容。价值数千行。这不是我的本意。有任何想法吗?谢谢!
PS 我想要这种行为的原因是因为我编写了一些脚本语言来自动化游戏。如果我想像正常人一样按住向上箭头键,我认为我需要我正在谈论的行为。
编辑:
由于似乎有些混乱,我表示歉意。让我详细说明一下。在我的第一个代码中,如果我选择“r”作为字符,那么无论持续时间如何,它都只会打印一个 r 。如果您在键盘上按“r”5 秒钟,它将进入 -> r...rrrrrrrrrrrrrrrr 其中 ... 意味着一秒钟的时间。这就是我想要的行为,但我不会得到它。第二个代码是我尝试垃圾邮件单击“按”的地方,但这实际上每次执行时都会键入“r”。因此,如果我处于定时循环一段时间,则每次循环迭代时都会发送“r”按钮。那不是我想要的。我再次想要的是与按下键盘上的 r 3 秒所发生的结果相同的结果。首先它只是一个 r,然后 rrrrrrrrrrrrrrrrrrrrr。我什至不确定release()方法的作用...我想如果你把它留在按下而不释放,它只会在循环中垃圾邮件屏幕!为什么不呢,按键已按下?这就是让我困惑的地方。显然,当按下某个键时,它不会保持按下状态。
java ×3
algorithm ×1
apache-spark ×1
awt ×1
awtrobot ×1
c# ×1
concurrency ×1
instanceof ×1
object ×1
oop ×1
pyspark ×1
python ×1
reflection ×1
scala ×1