我正在寻求澄清如何确定特定功能的界限。
例如:A(n)= log(2 ^ n)+ n ^(1/3)+ 1000 我是否正确地说最后两个条款可以被“忽略”,因为与第一个相比它们是微不足道的?因此界限是O(2 ^ n)?
例2:B(n)= n +(1/2)* n +(1/3)* n +(1/4)* n + ... + 1 我对这一点更不确定,但我会猜测它会是O(n)? 1被忽略(根据例如1中1000的推理),这就是我所确定的。
还在考虑E.g中的分数。修改了2,使得分母以不同的模式运行(例如(1/2)* n +(1/4)* n)+(1/8)* n ......),增长的顺序是比Eg更快/更慢2?
感谢任何指导!谢谢!
答案 0 :(得分:1)
E.g 1: A(n) = log(2^n) + n^(1/3) + 1000
这里log(2 ^ n)= n大于n ^(1/3),因此通过Order函数A的属性(n0 = O(n)
E.g 2: B(n) = n + (1/2)*n + (1/3)*n + (1/4)*n + ... 1
= n*(1 + 1/2 + 1/3 + 1/4 ....+ 1/n)
现在(1 + 1/2 + 1/3 + 1/4 ....)你可以通过认为它是从1到n的dx / x的积分来近似,这将成为log(n),从而产生结果订单= O(nlgn)
E.g 2 Modified = n + (1/2)*n + (1/4)*n + (1/8)*n +.....
= n( 1+ 1/2 + 1/4 +1/8...) [GP series]
= n / (1/(1-1/2))
= 2n
所以它变成了O(n)
答案 1 :(得分:0)
例如1:A(n)= log(2 ^ n)+ n ^(1/3)+ 1000我是否正确地说最后2个术语可以被“忽略”,因为与之相比它们是无关紧要的首先?因此界限是O(2 ^ n)?
如果您简化表达式,则会得到A(n) = n*log(2) + n^(1/3) + 1000
。最后两个词的增长速度比第一个n*log(2)
增长得慢,O(n)
只是A(n)
。因此O(n)
为n + (1/2)*n + (1/3)*n + (1/4)*n
。
例如2:B(n)= n +(1/2)* n +(1/3)* n +(1/4)* n + ... + 1我对此更不确定,但我会猜测它会是O(n)? 1被忽略(根据例如1中1000的推理),这就是我所确定的。
这个很棘手,因为它涉及无限系列。如果您只有a*n
,则它等同于a
,其中包含一些小数O(n)
,即B(n)
。但是,由于表达式是一个称为harmonic series的发散无限级数,因此您无法断定O(n)
是B(n)
。事实上,S_k(1/i)*n + 1
可以简化为S_k(1/i)
,因为k趋于无穷大,1/i
的总和为i
1
从k
到S_k
。由于B(n)
因k趋于无穷大而发散,n>0
也趋于无穷大,假设为B(n)
。
最后,B(n)
没有限制。它没有适当的增长顺序。
修改:如果(1/n)*n
不包含无限系列,而是停在1
,这是表达式中的最后一个B(n)/n
,那么答案就是答案是不同的。
The partial sums of the harmonic series have logarithmic growth。这意味着n
是O(log n)
,它恰好是谐波系列的部分和,最多为B(n)
。最后,O(n log n)
只是public class Client {
private static Scanner sc = new Scanner(System.in);
private static Socket client;
private static Random r = new Random();
public static int status = 0;
public static String nickname;
public static void main(String[] args) {
connect();
handle();
// end();
}
private static void connect()
{
try {
client = new Socket("localhost",9999);
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
//sc - Scanner(System.in);
//sl - nickname i want to put into DataOutputStream
String sl = sc.nextLine();
sendPacket(new Greetings(sl));
} catch (IOException e) {
e.printStackTrace();
}
}
private static void sendPacket(Packet packet)
{
try {
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
System.out.print(dos.size());
dos.writeInt(packet.getId());
packet.send(dos);
} catch (SocketException se) {} catch (IOException e) {
e.printStackTrace();
}
}
private static void handle()
{
}
private static void end()
{
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
I am using package system to send information. Format of auth package is [id(int)]+[name(String)]
。