对数级O(lgn)速度其实很快,接近常数级O(n)。 lg100000000=30(近似,另外计算机中lg以2为底)。所以O(nlgn)比O(n^2)性能的提升比想象中大得多。
程序加载后,OS给其分配的内存分为堆区和栈区,以前一直不知道堆区和数据结构中的堆有什么联系。后来听老师说,堆区主要用来malloc申请内存,因为每次都要找到合适的大小,所以导致堆区的内存碎片较多,像马蜂窝一样。
因为每次都要找到最大的内存块,所以大顶堆这种数据结构特别适合管理堆区的内存,建堆可以控制在lg级,而最大的内存块几乎可以随时取出来。所以堆排序算法并不常用,实际中用的更多的是堆这种数据结构本身。
O(n^2)排序算法慢的原因是因为最坏时要把每两个元素都进行比大小,比的次数自然是平方级。所以要想研究出更快的排序算法,就要从减少元素的比较次数入手。比如快速排序算法,选好pivot值进行一趟排序后,比他小的部分就不用再和比他大的部分进行比较了,这样便减少了比较次数。
一般来说,一个进程的内存限制是2G,而每个线程要预留1M的内存空间,所以理论上一个进程可以开最多2048个线程(当然实际肯定要比这少)。可以通过修改默认线程空间的大小达到突破2048限制的目的,不过没什么实用价值,因为线程多了CPU的调度开销也会随之变大。
#关于c语言中主函数的参数#
c语言主函数有两个参数,一个是argc,一个是argv。这两个参数都是在运行时传入的命令行参数,Windows由于很少用命令行编译执行,所以不常见到。第一个参数代表传入参数的个数,argument count。第二个代表是指向内存的二级字符指针argument vector,并且argv[0]一定是程序名称,并包含了完整路径。所以实际参数个数是argc-1个。