我想f(int x) { return x == 0 ? 0 : 1; }用Java 实现.
在C中,我只是" return !!x;",但!在Java中并不像那样.有没有办法在没有条件的情况下做到这一点?没有像展开版本那样俗气的东西
int ret = 0;
for (int i = 0; i < 32; i++) {
ret |= ((x & (1 << i)) >>> i);
}
Run Code Online (Sandbox Code Playgroud)
要么
try {
return x/x;
} catch (ArithmeticException e) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
)
编辑:
所以,我做了三个不同解决方案的微基准测试:
随机int输入的时间(整个int范围)是:
1. 0.268716
2. 0.324449
3. 0.347852
Run Code Online (Sandbox Code Playgroud)
是的,我的愚蠢的x/x解决方案的速度非常快.当您考虑到其中只有很少的0时,并不是很令人惊讶,并且在绝大多数情况下都会采用快速路径.
50%输入为0的更有趣案例的时间安排: …
Test.java
package a;
import b.B;
public class Test {
public static void main(String[] v) {
new A().test();
new B().test();
}
}
Run Code Online (Sandbox Code Playgroud)
A.java:
package a;
public class A {
protected void test() { }
}
Run Code Online (Sandbox Code Playgroud)
B.java:
package b;
public class B extends a.A {
protected void test() { }
}
Run Code Online (Sandbox Code Playgroud)
为什么会new B().test()出错?这不会破坏可见性规则吗?
B.test()是不可见的,Test因为它们在不同的包中,但它拒绝调用可见的test()in B超类.
将赞赏与JLS的适当部分的链接.
我用Java编写了两个矩阵类,只是为了比较矩阵乘法的性能.一个类(Mat1)存储矩阵double[][] A行所在的成员.其他类(MAT2)存储和其中是的转置.iA[i]ATTA
假设我们有一个方矩阵M,我们想要它的乘积M.mult(M).打电话给产品P.
当M是Mat1实例时,使用的算法是直截了当的:
P[i][j] += M.A[i][k] * M.A[k][j]
for k in range(0, M.A.length)
Run Code Online (Sandbox Code Playgroud)
在M是我使用的Mat2的情况下:
P[i][j] += M.A[i][k] * M.T[j][k]
Run Code Online (Sandbox Code Playgroud)
这是相同的算法,因为T[j][k]==A[k][j].在1000x1000矩阵上,第二个算法在我的机器上花费大约1.2秒,而第一个算法花费至少25秒.我期待第二个更快,但不是这么多.问题是,为什么这么快?
我唯一的猜测是第二个更好地利用了CPU缓存,因为数据以大于1个字的块的形式被拉入缓存,第二个算法通过仅遍历行来获益,而第一个算法忽略了拉入的数据缓存通过立即到达下面的行(在内存中大约1000个字,因为数组以行主要顺序存储),没有缓存的数据.
我问了一个人,他认为这是因为更友好的内存访问模式(即第二个版本会导致更少的TLB软故障).我根本没有想到这一点,但我可以看到它如何导致更少的TLB故障.
那么,这是什么?还是有其他原因导致性能差异?
我有一个带有点S,C1,C2,E的贝塞尔曲线B和一个表示宽度的正数w.有没有办法快速计算两个贝塞尔曲线B1,B2的控制点,使得B1和B2之间的东西是由B表示的加宽路径?
更正式地:计算好的Bezier近似值的控制点为B1,B2,其中B1 = {(x,y)+ N(x,y)(w/2)| (x,y)in C}
B2 = {(x,y) - N(x,y)(w/2)| (x,y)在C}中,
其中N(x,y)是(x,y)处的C的法线.
我说好近似值因为B1,B2可能不是多项式曲线(我不确定它们是否是).
我的问题是:给定一个长度为n的列表L,以及一个整数i,使得0 <= i <n !,如何编写函数perm(L,n)以在O(n)中产生L的第i个排列时间?我所说的ith排列只是在某些实现定义的排序中的第i个排列必须具有以下属性:
对于任何i和任何2个列表A和B,perm(A,i)和perm(B,i)必须将A和B的第j个元素映射到A和B的相同位置的元素.
对于任何输入(A,i),(A,j)perm(A,i)== perm(A,j)当且仅当i == j时.
注意:这不是作业.事实上,我在2年前解决了这个问题,但我已经完全忘记了这一点,这让我感到害怕.此外,这是我在一个解决方案上做出的破坏尝试:
def perm(s, i):
n = len(s)
perm = [0]*n
itCount = 0
for elem in s:
perm[i%n + itCount] = elem
i = i / n
n -= 1
itCount+=1
return perm
Run Code Online (Sandbox Code Playgroud)
另请注意:O(n)要求非常重要.否则你可以生成n!所有排列的大小列表,只返回其第i个元素.
NLTK的块解析器的正则表达式可以匹配POS标签,但它们是否也可以匹配特定的单词?
因此,假设我想要使用名词后跟动词"left"(将此模式称为L)来组合任何结构.例如,句子"\ DT dog\NN left\VB"应该被分块为
(S(DT)(L(NN dog)(VB左))),但句子"\ DT dog\NN睡觉"\VB"根本不会被分块.
我无法找到关于分块正则表达式语法的任何文档,我看到的所有示例都只匹配POS标记.
我有 2 个关于贝塞尔曲线的问题,并使用它们来近似圆的部分。
给定单位圆弧 (1,0)->(cos(a),sin(a)) 其中 0 < a < pi/2,是否会很好地逼近该弧以找到贝塞尔曲线的控制点 p1 , p2 通过求解由要求 B(1/3) = (cos(a/3), sin(a/3)) 和 B(2/3) = (cos(2a/3), sin( 2a/3))。(换句话说,要求贝塞尔曲线通过弧中的两个均匀间隔的点)。
如果我们有一个仿射变换 A 将圆弧转为椭圆弧,变换后的控制点 Ap0、Ap1、Ap2、Ap3 是否会定义椭圆弧的良好贝塞尔近似?
p0 和 p3 当然是曲线的起点和终点:(1,0) 和 (cos(a), sin(a))。
谢谢
一点菜鸟问题:我需要A和B类,这样A有B*成员,B有A*成员.
编译时我得到"错误:ISO C++禁止声明'B'没有类型".我怎么能绕过这个?
假设我有一个字符串列表,我想过滤掉所有非大写字符串.有没有比做过滤器更简单的方法(lambda x:x.isupper(),list)?