From 06540b0631e02a7273ef110916c3f92f7c2f12c0 Mon Sep 17 00:00:00 2001 From: nonstriater <510495266@qq.com> Date: Sat, 10 May 2014 19:50:03 +0800 Subject: [PATCH] add .gitignore --- .gitignore | 16 +++ README.md | 63 +++++--- a.out | Bin 9872 -> 0 bytes a.out.dSYM/Contents/Info.plist | 20 --- a.out.dSYM/Contents/Resources/DWARF/a.out | Bin 11125 -> 0 bytes 图/README.md | 27 ++++ 多线程.md | 7 + 排序算法/README.md | 1 + 排序算法/a.out | Bin 10324 -> 0 bytes 排序算法/a.out.dSYM/Contents/Info.plist | 20 --- .../a.out.dSYM/Contents/Resources/DWARF/a.out | Bin 11555 -> 0 bytes 算法分析思路/分治算法.md | 0 算法分析思路/动态规划.md | 0 算法分析思路/回溯法.md | 0 算法分析思路/枚举迭代.md | 0 算法分析思路/贪心算法.md | 0 算法分析思路/递归.md | 0 算法问题选编/二叉树.md | 4 + 算法问题选编/堆和栈.md | 55 ++++++- 算法问题选编/数值问题.md | 93 ++++++++---- 算法问题选编/数值问题/1.c | 37 ----- 算法问题选编/数值问题/2.c | 23 --- 算法问题选编/数值问题/3.c | 71 --------- 算法问题选编/数值问题/4-1.c | 7 - 算法问题选编/数值问题/5.c | 25 ---- 算法问题选编/数值问题/6.c | 70 --------- 算法问题选编/数值问题/7.c | 14 -- 算法问题选编/数值问题/a.out | Bin 8456 -> 0 bytes .../数值问题/a.out.dSYM/Contents/Info.plist | 20 --- .../a.out.dSYM/Contents/Resources/DWARF/a.out | Bin 9547 -> 0 bytes 算法问题选编/数组数列问题.md | 5 +- 算法问题选编/测试代码/8.c | 11 ++ 算法问题选编/测试代码/9.c | 53 +++++++ 算法问题选编/测试代码/a.out | Bin 15300 -> 0 bytes .../测试代码/a.out.dSYM/Contents/Info.plist | 20 --- .../a.out.dSYM/Contents/Resources/DWARF/a.out | Bin 14354 -> 0 bytes 算法问题选编/测试代码/most_visit_ip.c | 135 ++++++++++++++++++ 算法问题选编/海量数据处理.md | 106 ++++++++++++-- 38 files changed, 513 insertions(+), 390 deletions(-) create mode 100644 .gitignore delete mode 100755 a.out delete mode 100644 a.out.dSYM/Contents/Info.plist delete mode 100644 a.out.dSYM/Contents/Resources/DWARF/a.out delete mode 100755 排序算法/a.out delete mode 100644 排序算法/a.out.dSYM/Contents/Info.plist delete mode 100644 排序算法/a.out.dSYM/Contents/Resources/DWARF/a.out delete mode 100644 算法分析思路/分治算法.md delete mode 100644 算法分析思路/动态规划.md delete mode 100644 算法分析思路/回溯法.md delete mode 100644 算法分析思路/枚举迭代.md delete mode 100644 算法分析思路/贪心算法.md delete mode 100644 算法分析思路/递归.md delete mode 100644 算法问题选编/数值问题/1.c delete mode 100644 算法问题选编/数值问题/2.c delete mode 100644 算法问题选编/数值问题/3.c delete mode 100644 算法问题选编/数值问题/4-1.c delete mode 100644 算法问题选编/数值问题/5.c delete mode 100644 算法问题选编/数值问题/6.c delete mode 100644 算法问题选编/数值问题/7.c delete mode 100755 算法问题选编/数值问题/a.out delete mode 100644 算法问题选编/数值问题/a.out.dSYM/Contents/Info.plist delete mode 100644 算法问题选编/数值问题/a.out.dSYM/Contents/Resources/DWARF/a.out create mode 100644 算法问题选编/测试代码/8.c create mode 100644 算法问题选编/测试代码/9.c delete mode 100755 算法问题选编/测试代码/a.out delete mode 100644 算法问题选编/测试代码/a.out.dSYM/Contents/Info.plist delete mode 100644 算法问题选编/测试代码/a.out.dSYM/Contents/Resources/DWARF/a.out create mode 100644 算法问题选编/测试代码/most_visit_ip.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..261e4ff --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ + +#### + +*.out +*.dSYM + +*.dat +*.txt +*ipslice* + + + + +##### + + diff --git a/README.md b/README.md index c7483fe..8cd335f 100644 --- a/README.md +++ b/README.md @@ -83,14 +83,7 @@ KMP 快递选择SELECT -** @ July 博客 ** -《数学建模十大经典算法》 -《数据挖掘领域十大经典算法》 -《十道海量数据处理面试题》 -《数字图像处理领域的二十四个经典算法》 -《精选微软等公司经典的算法面试100题》 - - + ## 算法设计思想 @@ -110,26 +103,62 @@ http://www.chinaunix.net/old_jh/23/437639.html -## 后续阅读 +## 推荐阅读 + + +《数据结构与算法分析》 +《编程之美》 +《算法设计与分析基础》 + +《算法导论》 有哪些算法 +《算法引论》 如何创造算法 断货 -《算法导论》 -《编程珠玑》 -《编程之美》 《剑指offer》 + +*侧重经典算法的实现* +《Elements of Programming》 STL代码 快 准 狠 +《C interfaces and Implementation》 + + +《微软的梦工厂》 +《Language Implementatin patterns》 +《Algorithms on Strings,Trees and Sequences》 + + +《writing efficient programs》 优化 + +《Algorithm Design Manual》 红皮书 + +《编程珠玑》Programming Pearls 偏算法理论 +《More Programming Pearls》 偏算法轶事 + +《The science of programming》 证明代码段的正确性 800块一本 + + +*高级数据结构*(如元胞自动机、斐波纳契堆、线段树) + +《Algorithms》 4版 +《Advanced Data Structures》 各种诡异数据结构和算法 600块 + + 《深入理解计算机系统》 《TCP/IP详解三卷》 《UNIX网络编程二卷》 《UNIX环境高级编程:第2版》 + + - - ## 参考链接和学习网站 -POJ http://openjudge.cn/ -这有个POJ上的ACM训练方案 http://www.java3z.com/cwbwebhome/article/article19/res041.html +** @ July 博客 ** +《数学建模十大经典算法》 +《数据挖掘领域十大经典算法》 +《十道海量数据处理面试题》 +《数字图像处理领域的二十四个经典算法》 +《精选微软等公司经典的算法面试100题》 微软面试100题 http://blog.csdn.net/column/details/ms100.html 程序员编程艺术 http://blog.csdn.net/v_JULY_v/article/details/6460494 @@ -169,6 +198,6 @@ http://www.cs.usfca.edu/~galles/visualization/Algorithms.html http://leetcode.com/ http://oj.leetcode.com/ - +http://openjudge.cn/ POJ。这有个POJ上的ACM训练方案 http://www.java3z.com/cwbwebhome/article/article19/res041.html diff --git a/a.out b/a.out deleted file mode 100755 index 0cf0c2109e5550dc12b1962c35c8d0ee9aa924a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9872 zcmeHNTWl0n7(Pp>fPxg%L=bej6zi>9)M}%mt?B9z5Gxl&K~DG9?v}l|yQP<;S~Vt4 zu%^aad@vX_ipC2M#Go;VSNcFejV2n6sYcB-!GI4&B!>EZXU=SAr`G6;PxB||od5f; zXZ|^Jx}7sePX2Ogh7f@&AqJ-jA!^XttA%(-1i=Zh0L?&?vaRLj@Ll2cw^CY3flBzd zh;izWK+28b%^NFCls^-@Nn^}SU^?P7t&_5p=q*hcdgBex#>GH=J}(ADJl$sPe!3WR zLn(`;?r5#5q3N%M;p zONCUnQ`>vv4bHXaw^-|m-Bb}93Msp@J*jM5rm`J5g)8sJvpSx0y~O`SQYMnJqY%j? zY%A~lEFJG$9fTNbZA#)gX~GSZvbAMni^~k_p<&3NB7}tp{Wi~B~eVJ%3E%T+q zl<}M}T=6A&zbmX7n)xe+gYu6sc?s#0sxYcEnGM39^a#=^u&W-#V`iiAQrvAoy%p(u#Ek8eUje@Y zeg*sr_!aOgAjBra{K#X2U#e z-Dqbx!VBB)SeoH)t!kwhuqOPCp>qzL8Xt$38UD)p6~@NUz-WcOW?bvPus&m|@Ta)M z7ZBSTRpzUn=9SF36aD?~BY`mI+ydSVAF@6Mx_{NRK;rw~s?G4o+=tG#eXfAa>Y{P@ zqcQ%cHuf^plxJ(~9I!0@%&icOn&AW1W;?>KNM(lKwfNHr6PmA5?z5T!RdvkpUUS5F z@T0c7KOC>!3ghwGZK`iqeN^>v)pw{qsroL}r&XU-eO~ni^g^s1T09F(%ZBmVKLCf5 z6psCjsVDhUbL?Akmy-LOoI!4cT!h?ya{c7?k{c%XD!CWQJx6XIxu?i|N$wGH$H+ZE zj=9Hr!9{Ee25aM|iyhH2Da@HJLL<3H-Uj|-dnHD;H#ubxc`PdYNDkmfCcPDr;oTwy z`qzs2ZY~8}xXM9$WRePLG@Q7}aB1k2~}@k;&)$ z3iuW9E8thauYg|xzXE;*{0jIL@GIa~z^{N`f&Z%l^On|ZWv+S6JWNxE;WCQzVH{rH zRuIFYP&2Pt=5YXB>L5CosFW-uB5@pG;utwv$VK9@NU=n1(5sCnaCn{Tqpr@YOJ!5a zsllu0iP(xJw*nbU3C3x5NfW)crQwow6fW&tS)iRTmiQYsE3God;gk@~9%XL$CHYTpih;=E^&dQ}qDV+W$_$o(C zTPa#E7ptqp@B+NQ8N~VLvJby5FZbsJHc-E61@Idkk8ZgT^O) zJiaU4;Bp}|d`M+VsGZP$o~7Dq@U_Y0eZXx6AKO`*Pn|<=y;E(vm2zi?tCXs(tx}}6 n*a?xnxt6ioR?A3jsAW{Sm3qXLnQT+FMSAS?#yROP4i>~;?-uS~ diff --git a/a.out.dSYM/Contents/Info.plist b/a.out.dSYM/Contents/Info.plist deleted file mode 100644 index 3679a65..0000000 --- a/a.out.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.a.out - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/a.out.dSYM/Contents/Resources/DWARF/a.out b/a.out.dSYM/Contents/Resources/DWARF/a.out deleted file mode 100644 index fb793ef4d60509bf0be29accc0d9292d32b9ba52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11125 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 diff --git a/图/README.md b/图/README.md index e69de29..faca6a3 100644 --- a/图/README.md +++ b/图/README.md @@ -0,0 +1,27 @@ + + +##图 + + +## 图的存储结构 + +对象和指针 +矩阵 +邻接表 + + +## 图的操作 + +###遍历 + +广度优先 +深度优先 + +Dijkstra +A* + +用于游戏编程和分布式计算 + + + + diff --git a/多线程.md b/多线程.md index db1f739..9713813 100644 --- a/多线程.md +++ b/多线程.md @@ -148,6 +148,13 @@ A线程一直在while循环上等待,但是B线程有无法获得lockobj锁而 +实现一个队列。队列的应用场景为: +一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列 + + + + + ### 读者写者问题 这也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。 diff --git a/排序算法/README.md b/排序算法/README.md index 2139266..9ae5ffb 100644 --- a/排序算法/README.md +++ b/排序算法/README.md @@ -126,6 +126,7 @@ 堆排序主要时间花在建堆期间和`堆化数组`,找数列中最大树只需要O(1)时间复杂度 +推排序还可以用来求 top-K 大(小)的问题。 diff --git a/排序算法/a.out b/排序算法/a.out deleted file mode 100755 index 595f974173e637bedc0944852036d03eb581c4be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10324 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 XyXSciPzSj_!u8=j=gmNdh!Fn;{fmOw diff --git a/排序算法/a.out.dSYM/Contents/Info.plist b/排序算法/a.out.dSYM/Contents/Info.plist deleted file mode 100644 index 3679a65..0000000 --- a/排序算法/a.out.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.a.out - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/排序算法/a.out.dSYM/Contents/Resources/DWARF/a.out b/排序算法/a.out.dSYM/Contents/Resources/DWARF/a.out deleted file mode 100644 index 6ff39efd652ba700b781bee8f64f821865af59c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11555 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 diff --git a/算法分析思路/分治算法.md b/算法分析思路/分治算法.md deleted file mode 100644 index e69de29..0000000 diff --git a/算法分析思路/动态规划.md b/算法分析思路/动态规划.md deleted file mode 100644 index e69de29..0000000 diff --git a/算法分析思路/回溯法.md b/算法分析思路/回溯法.md deleted file mode 100644 index e69de29..0000000 diff --git a/算法分析思路/枚举迭代.md b/算法分析思路/枚举迭代.md deleted file mode 100644 index e69de29..0000000 diff --git a/算法分析思路/贪心算法.md b/算法分析思路/贪心算法.md deleted file mode 100644 index e69de29..0000000 diff --git a/算法分析思路/递归.md b/算法分析思路/递归.md deleted file mode 100644 index e69de29..0000000 diff --git a/算法问题选编/二叉树.md b/算法问题选编/二叉树.md index a055e4d..fe8e1d4 100644 --- a/算法问题选编/二叉树.md +++ b/算法问题选编/二叉树.md @@ -1,3 +1,7 @@ + + + + 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 diff --git a/算法问题选编/堆和栈.md b/算法问题选编/堆和栈.md index d8c8bb7..d602347 100644 --- a/算法问题选编/堆和栈.md +++ b/算法问题选编/堆和栈.md @@ -1,17 +1,44 @@ -18、如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列头到队列尾的元素个数(包含队列头、队列尾)(华赛面试题、腾讯笔试题)。 +如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列头到队列尾的元素个数(包含队列头、队列尾)(华赛面试题、腾讯笔试题)。 + +有rear指针时: + +if rear>front count = rear-front+1 +else count = rear-front+m+1 +综合,count = (rear-front+m+1)%m + +不用rear指针的话: + +数据结构中加一个 int count来计数。 -2.设计包含min函数的栈。 + + +设计包含min函数的栈。 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 +主要是min函数实现。咋一看,用一个变量来存储最小值,或最小值的下标不就ok了?这在只push的时候有用,想想如果这个最小值pop出去了呢?我们怎么更新现在的最小值? + +这里用一个辅助栈,空间复杂度是O(n). + +push一个元素a时,该元素a与辅助栈顶f[top]元素比较: +a > f[top],在辅助栈再次中push一遍f[top] (可以把这个省去,节省空间,代价是pop的时候要跟最小栈元素比较,如果pop元素跟最小栈栈顶相等,可能最小值要变了) +a < f(top),把 a push 到 辅助栈中 + +这样辅助栈中的元素是 从上到小 递增的数列。 +且 辅助栈中的栈顶元素 总是 栈中元素集合的最小值。 + +以上方法需要的空间复杂度是O(n) -29.栈的push、pop序列 + + + +栈的push、pop序列 题目:输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的。 @@ -23,18 +50,32 @@ push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop, 但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。 +这里只是要判断是不是pop序列,并没有要求所有的pop序列 -实现一个队列。 -队列的应用场景为: -一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列 +需要一个辅助栈(需要一个写好的栈结构辅助,如果是C语言,还要包装一个栈结构) + +对序列A中的A[0]入栈,比较B[0] +如果不相等,A[1]入栈 +直到A[i] = B[0] +栈顶出栈,开始匹配B[1] +如果A[i-1]!=B[1],那就继续入栈A[i+1] + +循环往复~ +如果最后,栈为空,就是一个pop序列;如果栈不为空,或者B数组都没有遍历到尾部,就肯定不是pop序列了 -66.颠倒栈。 + +颠倒栈 题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。 颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。 +递归方法 + + + + diff --git a/算法问题选编/数值问题.md b/算法问题选编/数值问题.md index 04f620d..e398ea2 100644 --- a/算法问题选编/数值问题.md +++ b/算法问题选编/数值问题.md @@ -19,7 +19,14 @@ int string_to_integer(char *s,int length) 分析: 1. 不能使用循环,那就用递归 -2. 递归需要终止递归的条件判断语句,这里也不能用if,想其他办法,可以使用 || 逻辑或运输符 +2. 递归需要终止递归的条件判断语句,这里也不能用if,想其他办法,可以使用 &&逻辑与 运算符(在n>0条件满足是,才会指向后面的递归语句 + + +int factorial(n){ + int sum=0; + (n>0) && sum=n+factorial(n-1) + return sum; +} @@ -30,8 +37,7 @@ int string_to_integer(char *s,int length) 分析: 这是一道很基本的考查位运算的面试题。 -包括微软在内的很多公司都曾采用过这道题。 -解法1:循环计数 +解法1:一轮循环移位计数 (移位运算比除法运算效率要高,注意要考虑是负数的情况) 解法2:位运算 解法3:num &= num-1 巧妙之处在于,对高位没有影响 @@ -39,6 +45,8 @@ int string_to_integer(char *s,int length) + + 请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 分析: @@ -73,16 +81,6 @@ tmp[i]= tmp[i]>=0?tmp[i]:tmp[i]+16; - -大整数乘法(或 大整数阶乘) -请使用代码计算1234567891011121314151617181920*2019181716151413121110987654321 。 - -1. 注意结果可能超出长整形的最大范围 2^64-1 -2. 采用分治算法,将大整数相乘转换为小整数计算 - - - - 编程实现两个正整数的除法(和取模) 编程实现两个正整数的除法,当然不能用除法操作符。 // return x/y. @@ -110,26 +108,23 @@ int div(const int x, const int y) + + 求两个或N个数的最大公约数和最小公倍数。 +大整数乘法(或 大整数阶乘) +请使用代码计算1234567891011121314151617181920*2019181716151413121110987654321 。 + +1. 注意结果可能超出长整形的最大范围 2^64-1 +2. 采用分治算法,将大整数相乘转换为小整数计算 + +规律分析: +任意位数的整数相乘,最终都可以转化为2位数相乘 -40、用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列, -如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连. - - - - - - - -给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), -指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。 - -比如,A=[1,0] K=21 那么输出结构应该为100。 @@ -153,7 +148,7 @@ int div(const int x, const int y) -30.在从1到n的正数中1出现的次数 +在从1到n的正数中1出现的次数 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。 @@ -167,8 +162,48 @@ int one_appear_count(int n); -19、判断一个自然数是否是某个数的平方 -说明:当然不能使用开方运算。 + + +判断一个自然数是否是某个数的平方。说明:当然不能使用开方运算。 + +square(25) YES +square(35) NO + +方法1: 从1开始遍历,显然这种方法很差 +方法2: 除数跟余数比较,除数从2开始,每一轮都跟结果比较;相等就是存在这个数,不相等就把除数++;时间复杂度为(根号n)。在一个数比较大时,效率不够好。如1194877489=(34567)^2,需要从2开始,一直比较到34566,做3万多次除法和比较运算。跟方法1一样。。 + +方法3:二分查找 O(logn) + + + + + + +排列组合问题 + +1,2,3,4,5 五个不同的数字,打印不同的排列 + +这就是一个无向图的遍历,把每个数字看成一个节点。 + + +用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列, +如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连. + +这是对上一题增加难度。但是需要 +1. 去掉 3,5之间的联通 +2. 2重复,过滤重复结果 treeset +3. 4不能在3位 + + + + + + +给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), +指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。 + +比如,A=[1,0] K=21 那么输出结构应该为100。 + diff --git a/算法问题选编/数值问题/1.c b/算法问题选编/数值问题/1.c deleted file mode 100644 index 67829ea..0000000 --- a/算法问题选编/数值问题/1.c +++ /dev/null @@ -1,37 +0,0 @@ - -#include "stdio.h" -#include "string.h" - -int string_to_integer(char *s,int length){ - - if (length>1) - { - return s[0]=='-'?string_to_integer(s,length-1)*10-(s[length-1]-'0'):string_to_integer(s,length-1)*10+s[length-1]-'0'; - }else{ - return s[0]=='-'?-1/10:s[0]-'0'; - - } -} - -/* 问题: -1. s是空字符串 -2. s传参为非数字字符 -3. 超出整数所能表示范围 -*/ - - -int main(){ - - char *s = "4323"; - - printf("integer == %d\n",string_to_integer(s,strlen(s)) ); - printf("integer == %d\n",string_to_integer("12342",5)); - printf("integer == %d\n",string_to_integer("-11",3) ); - printf("integer == %d\n",string_to_integer("-5",2) ); - printf("integer == %d\n", string_to_integer("3",1)); - - printf("integer == %d\n", string_to_integer("abcd",4)); - printf("integer == %d\n", string_to_integer("a",1)); - - return 0; -} diff --git a/算法问题选编/数值问题/2.c b/算法问题选编/数值问题/2.c deleted file mode 100644 index b8f86c9..0000000 --- a/算法问题选编/数值问题/2.c +++ /dev/null @@ -1,23 +0,0 @@ - -#include "stdio.h" - - -int factorial(int n){ - - int ret=0; - (n==0) || (ret=n+factorial(n-1)); - return ret; -} - - -int main(){ - - int n=10; - printf("factorial(10)= %d\n",factorial(10)); - printf("factorial(5)= %d\n",factorial(5)); - printf("factorial(1)= %d\n",factorial(1)); - printf("factorial(0)= %d\n",factorial(0)); - - return 0; -} - diff --git a/算法问题选编/数值问题/3.c b/算法问题选编/数值问题/3.c deleted file mode 100644 index 669624e..0000000 --- a/算法问题选编/数值问题/3.c +++ /dev/null @@ -1,71 +0,0 @@ - -#include "stdio.h" -#include "stdlib.h" - -char *integer_to_bin(long integer){ - - int bit_num = sizeof(long)*8; - char *buffer= (char *)malloc(bit_num+1); - if (buffer==NULL) - { - return "malloc error"; - } - buffer[bit_num]='\0'; - - for (int i = 0; i < bit_num; ++i) - { - buffer[i]= integer<>(bit_num-1); - buffer[i]= buffer[i]==0?'0':'1'; - - } - return buffer; - -} - -char *integer_to_hex(long integer){ - - int bit_num=sizeof(long)*8/4; - char *buffer=(char *)malloc(bit_num+3); - buffer[0]='0'; - buffer[1]='x'; - buffer[bit_num+2]='\0'; - char *tmp=&buffer[2]; - - for (int i = 0; i < bit_num; i++) - { - tmp[i]= integer<<(i*4)>>(bit_num*4-4); - tmp[i]= tmp[i]>=0?tmp[i]:tmp[i]+16; - tmp[i]= tmp[i]<10?(tmp[i]+48):(tmp[i]-10+'A'); - } - - return buffer; -} - - -/* - -A 65 -0 48 - -*/ - - - -int main(){ - - - printf("b(11) = %s\n", integer_to_bin(11)); - printf("b(1023) = %s\n",integer_to_bin(1023) ); - printf("b(23564) = %s\n",integer_to_bin(23564) ); - - - printf("h(11) = %s\n", integer_to_hex(11)); - printf("h(1023) = %s\n",integer_to_hex(1023) ); - printf("h(23564) = %s\n",integer_to_hex(23564) ); - printf("b(11) = %x\n", 11); - printf("b(1023) = %x\n",1023 ); - printf("b(23564) = %x\n",23564 ); - - - return 0; -} \ No newline at end of file diff --git a/算法问题选编/数值问题/4-1.c b/算法问题选编/数值问题/4-1.c deleted file mode 100644 index 806e7d3..0000000 --- a/算法问题选编/数值问题/4-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "stdio.h" - -int main(){ - - printf("%ld",236432123443*33453098); - return 0; -} \ No newline at end of file diff --git a/算法问题选编/数值问题/5.c b/算法问题选编/数值问题/5.c deleted file mode 100644 index 4df163b..0000000 --- a/算法问题选编/数值问题/5.c +++ /dev/null @@ -1,25 +0,0 @@ - - -#include "stdio.h" - - -/* - - 1 是第一个元素 - 序列中元素被2或3或5整除 - -*/ -unsigned long value_in_sequence(unsigned index){ - - - - -} - - -int main(){ - - - - return 0; -} \ No newline at end of file diff --git a/算法问题选编/数值问题/6.c b/算法问题选编/数值问题/6.c deleted file mode 100644 index 926f346..0000000 --- a/算法问题选编/数值问题/6.c +++ /dev/null @@ -1,70 +0,0 @@ - - -#include "stdio.h" - -int binary_search_first(int *a,int length,int key){ - - int low=0; - int high = length-1; - int mid = 0; - - while(low=key)//往左找 - { - high = mid; - }else{ - - low = mid+1; - } - - } - return high; - -} - -int binary_search_last(int *a,int length,int key){ - - int low = 0; - int high = length -1; - int mid = 0; - - while(lowX(2)p5h-H)zTMe&v$cIzm;)y>-h_7dUp)JSaozPwnNG^=NGf(EDTi{ICF8kaxbeMp@&B~*sS>12_AM7L zg!%LjD1TyaJnmyJUN~3BdX678yL;R-5%#SUm=aLMFpjsbT{yQ9I)t6v0kkgHwiy_u zhzMHxkspp1fq5<_&>lj&4tf&m75cjBwR`)o!oKsR2660Il4ydq<+GW#WFpo!Fp?Yq zrfh?lJIUqoMm zGz0$@181Y9FVWFzBs$*y43$;PU#zcU{^Y}M#r)29$%;A4$MlL>WiytqJ{8l0=-s$( zdj;>mzWuKF*$6)W_T#ltGN()V$>1$coZ(aQm^oQ8Kh3O1_XSiCupKi$A!(OwsX9TM z0bX*fWPT{kMn~U9F1{((S{}f1YqvvJ9s%~Uxv#V?uT)CeJUf$A`@!v zkVCkD&J6-V42k>r6*3iA7e=PcZH_tAZ4sxOfiE&MpqASQOu7vgs2J~r_S3O_^C zeRZIF(6Dd(?14=-cD`@8-#^gK&*A-`7dz=-6rzLuFm8Gm*Cy@S+;uEkDdznF$~Nxp diff --git a/算法问题选编/数值问题/a.out.dSYM/Contents/Info.plist b/算法问题选编/数值问题/a.out.dSYM/Contents/Info.plist deleted file mode 100644 index 3679a65..0000000 --- a/算法问题选编/数值问题/a.out.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.a.out - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/算法问题选编/数值问题/a.out.dSYM/Contents/Resources/DWARF/a.out b/算法问题选编/数值问题/a.out.dSYM/Contents/Resources/DWARF/a.out deleted file mode 100644 index b61ec8e916c939f9e0c2dfc875291231fc0d6793..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9547 zcmeHNT}&KR6uvY2!3gY&(+-1BIx+m*M6n0EAI95DFmw+T zujr)I)aT3{PdnauKO_&`3rK(v%*PTpS+LsBpfqRZBRR`t$Gcv|@hU72u1nP?@OI)u zJQ~-N89mGJi}SrD@LD7Q)X2RhyW)%H%xuDl2?u+8HPt+xMGK&~QG^X$l;(}ugfT@E z#&nwL#qq5OJe>1Vgi<|Dr?cUd&b{sNT^D$`=A;x%jWk&`u9M%OP&yQv2w7%=>+){v z1aW1)lp0BzyO@fklQd&y_r)t*c7<`_d`c{gg3@I8PIxsUzWwlU9T%>{oqaVn`sAtM zp;5UfG+Ukma2|sIK^(>d)A;`U5&{Rl&V)`sDy&d-+i*1AbqY5V2;yMAuw9r?I;BVQ zF&d6Uvii*ac(cNvXtJ?)ZQ*6ZMoiD`if>lLH!g0UEfG&F+g*6q1YSsxbFDhx7NTh|hOeH1?@vzL|W)fX$GzCwEY!*gtS3Z7%(Y0=bU zdX}1L8c7&MdR(6)G!+J`BMt)&0}cZY0}cZY0}cZY0}cZY0}cZY0}cZY1OE>LO0Cjb z74W#KYLyyqGrVk8gNm!_g#ST*Tg7PLk&0TSP8oy`16&@$&7%PoRCiyI>hS|k9h?t% zTfqLX-w&?|%c{v}fDm8M^4viqV~`ylJwQLZ%HxI`Od~`dH&8rt0FlQH-9qQqo$E=k z3p@o~D###QB`W$2K~eFox8hNjv67v`;$%aabTPZqT?g#KS(UlSiyCblNdPvodgeAGEUYBL8i`Kb5u zQRD7!5J;0Td?v>JSU~X@4qGw!zD4%|)D_8}{5(OK^nMS$9=G>LtbF7{s8n(f-l67TgX|R+AqP}RT4VV}Uab$P4fStqsE6v+V*&O4>OWqEr2)4cP-T{`gLT|7 z{|b2jtOn}U&Vc%KKs{IWr}UMfx%%tM)uskj3#donuYp|yYHL7k#J^3|57;MJm~bKZ z;ua65Y$r|c7Mt*}sUAG7^QI2y=L-b^aC)NgaF!rRfJAT>l4&ERp~57DuPwE)vB@X2 z89kdzqz$b<*sZlklklRtv%kAL*b{u<_))Dr63*#U8gw(?-e7NT#yHBj>v}c^cXp-1 z(XJsq_q>_TbdBlZtkD@t#?sk@8BgW9HdmK#UR~N+Ufud&WozNJ&5gIZZZ56gSlHku zdzvC^5=ofU$frmoKRpfSZV8@E0Vha+naXeiFexj$k!M09kS%+w?}8du6BD#4;`huUxtC@;mdDpR8QLjf5W`OhI8Q8){@7g{?TKk#ZEa-=M~cLa~o2zw&THACBpQ zZ+ASz4=peA{|5x2wB}o{cP}jZquSE^IOs7bFG0b@i~TrlEii1yiz}cJT-s>HSq1Y) i?I&1rxF^w!vkvAnKfUlKw5*`83&ldivider){ + + divider++; + result = integer/divider; + + } + + if (result!=divider) + { + return -1; + } + + return result; +} + + +int main(int argc, char const *argv[]) +{ + // 243,1849(43),289(17), 64(8) + + int a[] = {1849,144,243,289,64,1194877489}; + for (int i = 0; i < sizeof(a)/sizeof(int); ++i) + { + int ret = isSquare(a[i]); + + if (ret==-1) + { + printf("%d 不是某个数的平方\n",a[i]); + }else{ + + printf("%d 是 %d 的平方\n", a[i], ret); + } + + } + + return 0; +} + + + + diff --git a/算法问题选编/测试代码/a.out b/算法问题选编/测试代码/a.out deleted file mode 100755 index d48b8986835364f13c7db81206c113122024ac70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15300 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 diff --git a/算法问题选编/测试代码/a.out.dSYM/Contents/Info.plist b/算法问题选编/测试代码/a.out.dSYM/Contents/Info.plist deleted file mode 100644 index 3679a65..0000000 --- a/算法问题选编/测试代码/a.out.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.a.out - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/算法问题选编/测试代码/a.out.dSYM/Contents/Resources/DWARF/a.out b/算法问题选编/测试代码/a.out.dSYM/Contents/Resources/DWARF/a.out deleted file mode 100644 index ce6429eebff093034a381eed05f1e65324322c41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14354 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 diff --git a/算法问题选编/测试代码/most_visit_ip.c b/算法问题选编/测试代码/most_visit_ip.c new file mode 100644 index 0000000..5c64dca --- /dev/null +++ b/算法问题选编/测试代码/most_visit_ip.c @@ -0,0 +1,135 @@ + +#include "stdio.h" // fwrite +#include "unistd.h" // write +#include "stdlib.h" // itoa +#include "string.h" + +#define test_file_path2 "./ip2.txt" +#define test_file_path "./ip.txt" +#define ip_count 100000000 //随机1亿个IP +#define tmp_file_count 32 + +#define mem_count 128*1024*1028 //128MB个IP空间 + + +int hash(unsigned i){ + + return i>>27; + +} + + +int main(){ + + + // 模拟创建一个文件,产生测试用的IP + // FILE *fd; + // fd = fopen(tmp_file_path,"a+"); + // for (int i = 0; i < ip_count;++i) + // { + // //char c[] = "this is sentence!"; + // unsigned random_ip = (unsigned)rand(); + // char tmp[50]; + // sprintf(tmp,"%d",random_ip); + // //printf("random ip = %s\n",tmp); + // fwrite(tmp,strlen(tmp),1,fd); + // fputc('\n',fd);//加入换行符号 + // } + + + //创建临时文件 + FILE *fd[tmp_file_count]; + for (int i = 0; i < tmp_file_count; ++i) + { + char file_path[128]; + //s[0]=(char)(i+48); + //char *file_path = strcat("./ipslice/ipslice",s) ; // 这样写出现 bus error!!! + sprintf(file_path,"./ipslice/ipslice%d",i); + fd[i] = fopen(file_path ,"a+" ); + if ( !fd[i]) + { + printf("file %d open fail!! \n" ,i); + } + } + + + + + //开始读测试数据IP,按IP,映射到32个文件中 + FILE *testfd = fopen(test_file_path2,"r"); + if (!testfd) + { + printf("file open fail !!\n"); + exit(-1); + } + unsigned tmp_data; + while( getline() ){ //能读到数据 // fread(&tmp_data,sizeof(unsigned),1,testfd) , C语言中没有getline() 这样的函数 + + printf("%d\n",(unsigned)tmp_data ); + int key = hash((unsigned)tmp_data);// key值即为对应文件fd + + int size = fwrite(&tmp_data,sizeof(unsigned),1,fd[key]); + printf("写入数据size=%d ,key=%d\n",size, key ); + + //跳过换行符 + fseek(testfd,1,SEEK_CUR); + } + + + + + // 依次读入每个文件并统计, hash_map 统计每个区间段的最大IP + int hash_map[mem_count]; + int max_ip; + int max_times; + + for (int i = 0; i < tmp_file_count; ++i) + { + + // hash统计 + while(){} + + //hash 表里找出最大的,变量一遍 + for (int i = 0; i < mem_count; ++i) + { + /* code */ + } + + } + + + + // 释放 + for (int i = 0; i < tmp_file_count; ++i) + { + fclose(fd[i]); + } + + + return 0; +} + + + +/** +关于warning +implicit declaration of function 'itoa' is invalid in C99 + +itoa() 函数并不是一个 standard functions ANSI C standard + + +inet_ntop() // 整数转换成 .分 ip地址 字符串 +inet_nton() // + +inet_aton() // + +struct in_addr + +*/ + + + + + + + diff --git a/算法问题选编/海量数据处理.md b/算法问题选编/海量数据处理.md index 99c6ace..2632992 100644 --- a/算法问题选编/海量数据处理.md +++ b/算法问题选编/海量数据处理.md @@ -2,23 +2,119 @@ /////////////////// 海量数据处理(千万以上量级) /////////// +时间上:无法在较短时间内迅速解决。可以设计巧妙的算法搭配合适的数据结构解决 +空间上:数据量太大,无法一次全部装入内存;针对方法是大而化小,分而治之。将规模大划分为规模小的问题,各个击破 -2.有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。 + +1. 分而治之/Hash映射 + hash统计 + 堆排序/快速排序/归并排序 +2. 双层桶划分 +3. Bloom filter 、Bitmap +4. Trie树/数据库/倒排索引 +5. 外排序 +6. 分布处理之 Hadoop/Mapreduce + + +### 海量日志处理,提取某日访问百度次数最多的那个IP(或top-K IP) + +分析 + +2^32 = 42亿九千万。。 +假设一个IP一天内访问百度的次数不查过40亿次,可以用unsigned表示。用数组统计处每个IP地址出现的最大次数,就可以得到访问次数最大的IP地址 + +unsigned count[N],这个N=2^32=4G个IP地址 sizeof(count) = 4*N = 16G内存,原因超过32位机器所支持的4G内存大小。因此不能直接创建这个数组 + + +第一步 分治法/文件映射 + +假设运行使用的内存是512MB, 512M/4 = 128M个IP地址(一个IP地址32位,占4个字节) +注意理解:`512M内存可以统计128M个不同的IP地址的访问次数`,哪怕切割的小文件中的IP总数大于128M + +4G/128M = 32,也就是把IP地址划分成 32 个不同的区间段,addr[1-xx],addr[xx-xx]..分别计算每个区间中访问次数最大的IP,然后再比较32个区间段中的最大次数,就可以得到所有IP的做大值了。 + +一个区间段的IP地址个数任然可能撑破128M个,从而撑爆内存 + +具体实施: +把大文件映射到小文件,有2种方式: + +1. 取模映射 。 IP%32 映射到32个小文件,把model相同的IP保存到同一个文件 +2. 位运算映射。把IP的前5为作为作为区间编号,即 IP>>27 结果就是[0,31],把相同区间的IP保存到同一个文件 + +上面的映射中,都不会出现同一个IP映射到不同小文件的情况 + + +第二步 统计每个小文件中的最大值 + +现在文件不同的IP数量达到内存承受的范文了,可以统计小文件中的IP次数了,使用常规的 hash_map(IP,count) 来 统计了 + + +第三步 排序 堆排序/快速排序/归并排序 + + + + + + + + + +###top-K 找出最大的k个数 + +hashmap + 堆 + +100w个数中找出最大的100个数。 + +类似问题: + + + +分析:100W个数里面是否有重复 + + +方案1:在前面的题中,我们已经提到了,用一个含100个元素的最小堆完成。复杂度为O(100w*lg100)。 + +方案2:采用快速排序的思想,每次分割之后只考虑比轴大的一部分,知道比轴大的一部分在比100多的时候,采用传统排序算法排序,取前100个。复杂度为O(100w*100)。 + +方 案3:采用局部淘汰法。选取前100个元素,并排序,记为序列L。然后一次扫描剩余的元素x,与排好序的100个元素中最小的元素比,如果比这个最小的要 大,那么把这个最小的元素删除,并把x利用插入排序的思想,插入到序列L中。依次循环,知道扫描了所有的元素。复杂度为O(100w*100)。 + + + + + +有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。 请用5分钟时间,找出重复出现最多的前10条。 +寻找热门查询,300万个查询字符串中统计最热门的10个查询 + + + + + 文件中的内容排序并去重复 一个文件中包含了1亿个随机整数,如何快速的找到最大(小)的100万个数字?(时间复杂度:O(n lg k)) 分析: 堆排序 + 3.2 在O(n lg k)时间内,将k个排序表合并成一个排序表,n为所有有序表中元素个数。 【解析】取前100 万个整数,构造成了一棵数组方式存储的具有小顶堆,然后接着依次取下一个整数,如果它大于最小元素亦即堆顶元素,则将其赋予堆顶元素,然后用Heapify调整整个堆,如此下去,则最后留在堆中的100万个整数即为所求 100万个数字。该方法可大大节约内存。 + +搜索中的智能提示(如 "中国" ,"zhongguo",考虑拼音) + +把2万个汉字排序,弄成一个超长的字符串 +用Int16索引汉字的所有拼音 +Int64 建立汉字和拼音的关联--汉字有多音字,需要把多个拼音pack到一个Int64,位操作搞定 +二分+位移unpack,直接做到汉字到拼音的检索 + + + + + 3.大量的URL字符串,如何从中去除重复的,优化时间空间复杂度 @@ -29,6 +125,7 @@ 一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数 + 假设一个文件中有9亿条不重复的9位整数,现在要求对这个文件进行排序。 @@ -184,13 +281,6 @@ s 求出每台电脑上的TOP10后,然后把这100台电脑上的TOP10组合 方案1:首先根据用hash并求模,将文件分解为多个小文件,对于单个文件利用上题的方法求出每个文件件中10个最常出现的词。然后再进行归并处理,找出最终的10个最常出现的词。 -12. 100w个数中找出最大的100个数。 - -方案1:在前面的题中,我们已经提到了,用一个含100个元素的最小堆完成。复杂度为O(100w*lg100)。 - -方案2:采用快速排序的思想,每次分割之后只考虑比轴大的一部分,知道比轴大的一部分在比100多的时候,采用传统排序算法排序,取前100个。复杂度为O(100w*100)。 - -方 案3:采用局部淘汰法。选取前100个元素,并排序,记为序列L。然后一次扫描剩余的元素x,与排好序的100个元素中最小的元素比,如果比这个最小的要 大,那么把这个最小的元素删除,并把x利用插入排序的思想,插入到序列L中。依次循环,知道扫描了所有的元素。复杂度为O(100w*100)。 13. 寻找热门查询: