数据结构与算法
秋刀鱼之味
这个作者很懒,什么都没留下…
展开
-
输出三角形
#include <stdio.h>#include <stdlib.h>//01.总结双重for循环的打印规律// 1.对规律做出分析,便于后续代码编写// 2.双重for循环内含的规律分析:// (1).外层循环执行一次,内存循环执行一轮// (2).外层循环控制行数,内层循环控制列数// (3).外层循环控制打印出来的换行符void show()转载 2017-03-19 14:51:36 · 1332 阅读 · 0 评论 -
经典排序算法代码
1、插入排序//插入排序void InsertSort(int Nums[],int Length){ for(int i=0;i<Length;i++) { int j,temp=Nums[i]; //将第i个数保存起来 for(j=i-1;Nums[j]>temp&&j>=0;j--) //依次将第i个数与前面的数比较 { Nums[j+1]=转载 2017-03-09 22:06:03 · 254 阅读 · 0 评论 -
在不用第三方参数的情况下,交换两个参数的值
方法一:#include void main(){int i=60;int j=50;i=i+j;j=i-j;i=i-j;printf(“i=%d\n”,i);printf(“j=%d\n”,j);}方法二:i^=j;j^=i;i^=j;方法三:// 用加减实现,而且不会溢出a = a+b-(b=a)转载 2017-03-06 18:08:56 · 482 阅读 · 0 评论 -
单链表编程题
算法思想:使用两个指针first和second,只是first每次走一步,second每次走两步:static Link GetMiddleOne(Link head){Link first = head;Link second = head;while (first != null && first.Next != null){first = first.Next.Next;seco转载 2017-03-06 18:16:25 · 944 阅读 · 0 评论 -
深度优先与广度优先
深度优先搜索算法(Depth First Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。 如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。 可以借助堆栈的数据结构,由于堆转载 2017-03-29 09:33:02 · 260 阅读 · 0 评论 -
常见面试题之链表操作
一、链表创建链表主要有三种形式,包括单链表、双链表和循环链表。 单链表每个节点只包含一个后驱指针,双链表节点同时包含一个前驱指针和一个后驱指针,循环链表的尾节点的后驱指向头节点。 代码如下:/*单链表节点结构*/typedef struct NodeType{char elem;NodeType*next;}Node;/*双链表节点结构*/typedef struct DNodeTy转载 2017-03-06 13:55:50 · 412 阅读 · 0 评论 -
编程题
1、用递归算法判断数组a[N]是否为一个递增数组bool fun( int a[], int n ){if( n= =1 )return true;if( n= =2 )return a[n-1] >= a[n-2];return fun( a,n-1) && ( a[n-1] >= a[n-2] );} 2、将一整数逆序后放入一数组中(要求递归实现)void convert(int转载 2017-03-06 16:38:18 · 606 阅读 · 0 评论 -
二插排序树
二分查找只适用于静态查找,不适合改变查找表。当然他们的时间复杂度都是logn 头文件#ifndef _BSTREE_H_ #define _BSTREE_H_ typedef void BSTree;//数据封装 typedef void BSKey; /********************** 结点指针域定义 **********************/ typedef转载 2017-08-22 09:11:54 · 434 阅读 · 0 评论 -
搜索算法二分查找法(折半查找法)
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果xa[n/2],则我们只要在数组a的右半部继续搜索x。二分搜索法的应用极其广泛,而且它的思想易于理解,但是要写一个正确的二分搜索算法也不是一件简单的事。第原创 2017-03-06 15:03:17 · 961 阅读 · 0 评论 -
插值法查找
#include <stdio.h> #include <time.h> #define SIZE 20 void print_array(int a[], int len) { int i = 0; for (i = 0; i < len; i++){ printf("%d,", a[i]); } printf("转载 2017-08-22 09:04:46 · 445 阅读 · 0 评论 -
经典算法面试题
1、说是有一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前十个词。 先用哈希,统计每个词出现的次数,然后在用在N个数中找出前K大个数的方法找出出现次数最多的前10个词。 2、如题1,但是这次文件特别大,没有办法一次读入内存。 1) 直接排序,写文件时,同时写入字符串及其出现次数。 2) 可以用哈希,比如先根据字符串的第一个字符将字符串换分为多个区域,每个区域的字符串写到一转载 2017-03-29 20:29:43 · 441 阅读 · 0 评论 -
判断两个单链表是否相交
这道题有多种算法。 算法1:把第一个链表逐项存在hashtable中,遍历第2个链表的每一项,如果能在第一个链表中找到,则必然相交。static bool JudgeIntersectLink1(Link head1, Link head2){Hashtable ht = new Hashtable();Link curr1 = head1;Link curr2 = head2;//st转载 2017-03-06 16:09:30 · 288 阅读 · 0 评论 -
找出单链表的倒数第4个元素
这道题目有两种算法,但无论哪种算法,都要考虑单链表少于4个元素的情况: 第1种算法,建立两个指针,第一个先走4步,然后第2个指针也开始走,两个指针步伐(前进速度)一致。static Link GetLast4thOne(Link head){Link first = head;Link second = head;for (int i = 0; i < 4; i++){if (firs转载 2017-03-06 16:01:16 · 743 阅读 · 0 评论 -
十大排序算法
选择排序 选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置已经是正确的了。 选择排序是不稳定的。算法复杂度是O(n ^2 )。class SelectionSorter{ private int min; public void Sort(int[] arr) {转载 2017-03-06 13:09:13 · 278 阅读 · 0 评论 -
怎么用C 语言实现的 Bloom Filter
Bloom Filter是1970年由Bloom提出的,最初广泛用于拼写检查和数据库系统中。近年来,随着计算机和互联网技术的发展,数据集的不断扩张使得 Bloom filter获得了新生,各种新的应用和变种不断涌现。Bloom filter是一个空间效率很高的数据结构,它由一个位数组和一组hash映射函数组成。Bloom filter可以用于检索一个元素是否在一个集合中,它的优点是空间效率和查询时间转载 2017-03-06 14:23:59 · 801 阅读 · 0 评论 -
什么是KMP匹配算法?
KMP虽然经典,但是并不是最快的,KMP在预处理模式串的时候还没有让j指针(指向模式串的指针)尽量跳过最大可跳过的距离,可以参考Sunday字符串匹配算法。 KMP算法是通过分析子串,预先计算每个位置发生不匹配的时候,所需GOTO的下一个比较位置,整理出来一个next数组,然后在上面的算法中使用。[C/C++]代码//kmp.h : kmp算法。//***********************转载 2017-03-06 14:26:00 · 434 阅读 · 0 评论 -
openssl 实现SHA1,DES等加密算法
编码规则:Digest = Base64(SHA1(str1 + “”+TimeStamp));Result=URLEncoding(ID+”” + TimeStamp)); Result = URLEncoding(ID +”" + Base64(3DES(str1 + "”+TimeStamp+“” + TimeStamp + “” +Digest))) 从编码规则中我们要使用SHA1、转载 2017-03-06 14:29:45 · 1292 阅读 · 0 评论 -
栈和队列
1.设计含min函数的栈,要求min、push和pop的时间复杂度都是o(1)。 算法思想:需要设计一个辅助栈,用来存储当前栈中元素的最小值。网上有人说存储当前栈中元素的最小值的所在位置,虽然能节省空间,这其实是不对的,因为我在调用Min函数的时候,只能得到位置,还要对存储元素的栈不断的pop,才能得到最小值——时间复杂度o(1)。 所以,还是在辅助栈中存储元素吧。 此外,还要额外注意Push转载 2017-03-06 14:48:49 · 321 阅读 · 0 评论 -
Bogosort排序算法
import java.util.*;public class Bogosort {private final static Random r = new Random();public static int[] verboseBogosort(int[] deck){System.out.println(toString(deck));do{deck = shuffle(deck);Sy转载 2017-03-06 14:57:32 · 1156 阅读 · 0 评论 -
古典算法问题
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?public class num6 {public static void main(String[] args) {int j, mon1, mon2;mon1 = mon2 = 1;Scanner sc = new Scanner(System转载 2017-03-06 15:04:55 · 790 阅读 · 0 评论 -
二叉树
目录: 1.二叉树三种周游(traversal)方式: 2.怎样从顶部开始逐层打印二叉树结点数据 3.如何判断一棵二叉树是否是平衡二叉树 4.设计一个算法,找出二叉树上任意两个节点的最近共同父结点,复杂度如果是O(n2)则不得分。 5.如何不用递归实现二叉树的前序/后序/中序遍历? 6.在二叉树中找出和为某一值的所有路径 7.怎样编写一个程序,把一个有序整数数组放到二叉树中? 8.判转载 2017-03-06 15:31:04 · 438 阅读 · 0 评论 -
判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度?
算法思想: 先分析是否有环。为此我们建立两个指针,从header一起向前跑,一个步长为1,一个步长为2,用while(直到步长2的跑到结尾)检查两个指针是否相等,直到找到为止。static bool JudgeCircleExists(Link head){Link first = head; //1 step each timeLink second = head; //2 steps e转载 2017-03-06 15:36:14 · 647 阅读 · 0 评论 -
STL之排序算法
1.merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个序列。 例如: vecIntA,vecIntB,vecIntC是用vector声明的容器,vecIntA已包含1,3,5,7,9元素,vecIntB已包含2,4,6,8元素vecIntC.resize(9); //扩大容量merge(vecIntA.begin(),ve原创 2018-06-09 23:50:04 · 173 阅读 · 0 评论