增长分析顺序

时间:2018-01-28 08:45:17

标签: algorithm

我正在寻求澄清如何确定特定功能的界限。

例如: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?

感谢任何指导!谢谢!

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 1kS_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。这意味着nO(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)]