我在哪里可以学习编程算法(java等),因为当我搜索排列,紊乱,排序等程序时,我总能找到数学算法。
由此得出以下关系:
!n = (n - 1) (!(n-1) + !(n-2)).\,
where !n, known as the subfactorial, represents the number of derangements, with the starting values !0 = 1 and !1 = 0.
Notice that this same recurrence formula also works for factorials with different starting values. That is 0! = 1, 1! = 1 and
n! = (n - 1) ((n-1)! + (n-2)!)\,
which is helpful in proving the limit relationship with e below.
Also, the following formulae are known:[4]
!n = n! \sum_{i=0}^n \frac{(-1)^i}{i!},
!n = \left\lfloor\frac{n!}{e}+\frac{1}{2}\right\rfloor , \quad n\geq 1,
!n = \left[ \frac{n!}{e} \right] , \quad n\geq 1
我发现另一个例子是当我查找java中的排序时,我看到O(n log n)或O(log n)术语,我根本不理解。我不擅长数学,但同时我对编程非常感兴趣。请帮我找一本书或网站,以了解编程语言中所需的排序算法
答案 0 :(得分:6)
算法是关于数学的。他们与语言无关。只要您了解其语法,即基本数据类型,运算符,决策等,您就可以使用任何语言实现算法。许多语言都提供了实现已知和/或有用算法或功能的库(例如用于排序,加密等)。 )
这就是为什么搜索“java算法”是一个糟糕的搜索字符串。您应该搜索“java programming basics”
如果你想了解算法的背后(美),我强烈建议你阅读这本伟大的书:"Programming Pearls" (2nd edition)。第一版写于1983年,17年后了解why the author decided to write a second edition很有意思。
您还可以查看在线讲座for instance MIT ones。
关于问题的O(log(n))部分,这是表达computational complexity of an algorithm的表示法(当您想要了解算法可以获得的性能时,或者如果您想要传达你自己算法的表现。)
对于Java,您可以从Oracle's tutorials开始。
答案 1 :(得分:3)
我在Coursera上取了Algorithms I和Algorithms II,他们很棒。该课程还有一个textbook。
答案 2 :(得分:2)
O(n log n)或O(log n)为Big O notation。我链接到了解释最常见情况(如您要求的示例)的部分。 还有excellent answer on stackoverflow
有关优秀文章,请参阅Algorithm Tutorials on Topcoder。
The Importance of Algorithms是很好的教程(解释基本算法,并提供Big O表示法的示例)。
Basics of combinatorics涵盖了您的问题 - 安排。
对于图书 - 请参阅Introduction to Algorithms和Algorithms, 4th Edition。