草庐IT

【蓝桥杯-筑基篇】搜索

热爱编程的小白白 2023-04-13 原文

🍓系列专栏:蓝桥杯

🍉个人主页:个人主页

目录

递归树

1.递归构建二进制串 

2.全排列的 DFS 解法

3.全排列的 BFS 解法

4.数的划分法

5.图书推荐


递归树

递归树是一种用于分析递归算法时间复杂度的工具。它可以将递归算法的执行过程可视化,从而更好地理解算法的时间复杂度。

递归树的构造方法如下:

  1. 首先,将递归算法的输入规模表示为根节点。
  2. 然后,将递归算法的每一次递归调用表示为树的一个子节点。
  3. 对于每个子节点,将其表示为一个与父节点相同的问题,但是规模更小的子问题。
  4. 重复上述步骤,直到递归算法的规模为 1 或者 0。

递归树的叶子节点表示递归算法的基本操作,而递归树的深度表示递归算法的递归深度。通过递归树,可以很容易地计算出递归算法的时间复杂度。

以下是一个递归树的例子:

构建二进制串 

 这个递归树表示的是一个将一个大小为 n 的问题分成两个大小为 n/2 的子问题的递归算法。从根节点到叶子节点的路径长度为 O(log n),因此,这个递归算法的时间复杂度为 O(n log n)。在实际应用中,递归树常常用于分析递归。

1.递归构建二进制串 

public class A {
    public static void main(String[] args) {
   
    	dg(0,"");

    }

	private static void dg(int depth, String bin) {
		if(depth==4) {
			System.out.println(bin);
			return ;
		}
		
		dg(depth+1,bin+"0");
		dg(depth+1,bin+"1");
		
	}

}
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 

修改一下:

public class A {
    public static void main(String[] args) {
   
    	DFS(0,"");

    }

	private static void DFS(int depth, String bin) {
		if(depth==4) {
			System.out.println(bin);
			return ;
		}
		
		for (int i = 0; i <= 1; i++) {
			DFS(depth+1,bin+i);
		}
		
		
		
	}

}

优化:用数组存

在这个例子中,我们使用了一个静态数组arr来存储每个深度的值,当深度达到4时,我们输出这个数组。在DFS函数中,我们使用了一个for循环来遍历每个深度的可能性,即0或1,然后将其存储在数组中,并递归调用DFS函数,直到深度达到4。

public class A {
	public static int[] arr=new int[4];
    public static void main(String[] args) {
   
    	DFS(0);

    }

	private static void DFS(int depth) {
		if(depth==4) {
			System.out.println(Arrays.toString(arr));
			return ;
		}
		
		for (int i = 0; i <= 1; i++) {
			arr[depth]=i;
			DFS(depth+1);
		}
		
		
		
	}

}

 结果:

[0, 0, 0, 0] [0, 0, 0, 1] [0, 0, 1, 0] [0, 0, 1, 1]
[0, 1, 0, 0] [0, 1, 0, 1] [0, 1, 1, 0] [0, 1, 1, 1] 
[1, 0, 0, 0] [1, 0, 0, 1] [1, 0, 1, 0] [1, 0, 1, 1] 
[1, 1, 0, 0] [1, 1, 0, 1] [1, 1, 1, 0] [1, 1, 1, 1] 

2.全排列的 DFS 解法

这段代码是一个全排列的DFS解法。我们使用了递归的方式来生成所有可能的排列。初始时,我们调用DFS函数,初始深度为0,初始答案为空字符串,n为3。在DFS函数中,我们首先判断当前深度是否达到n,如果达到,则输出答案并返回。否则,我们遍历所有可能的下一位数,如果该数未被使用,则将其加入到答案中,并递归调用DFS函数,深度加1。当递归返回时,我们将该数从答案中删除,以便遍历其他可能的下一位数。下面是代码实现:

public class A {
    public static void main(String[] args) {
   
    	DFS(0,"",3);

    }

	private static void DFS(int depth, String ans,int n) {
		if(depth==n) {
			System.out.println(ans);
			return ;
		}
		
		for (int i = 1; i <= n; i++) {
			if(!ans.contains(""+i))
			DFS(depth+1,ans+i,n);
		}
		
	
	}

}
 
123 132 213 231 312 321 

3.全排列的 BFS 解法

这段代码是一个全排列的BFS解法。我们使用了一个队列来存储每个深度的可能性,初始时,队列中包含了所有可能的第一位数。然后,我们遍历队列中的所有元素,将当前深度的可能性加入到队列中。当深度达到n时,队列中的所有元素即为所有可能的排列。

下面是代码实现:

public class A {
    public static void main(String[] args) {
        int n=3;
        Queue<String> q=new LinkedList<String>();
        //将所有可能的第一位数加入队列中
        for (int i = 1; i <= n; i++) q.offer(""+i);
        while(!q.isEmpty()) {
            String head=q.poll();
            for (int i = 1; i <= n; i++) {
                //如果当前深度的可能性中已经包含了i,则跳过
                if(head.contains(""+i)) continue;
                String son=head+i;
                //如果当前深度为n,则输出当前深度的可能性
                if(son.length()==n) System.out.println(son);
                //否则将当前深度的可能性加入到队列中
                else q.offer(son);
            }
        }


    }

}
  
123 132 213 231 312 321 

4.数的划分法

问题描述

将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的:
1,1,5; 

1,5,1;                 

5,1,1;


问有多少种不同的分法。

输入格式
n,k
输出格式
一个整数,即不同的分法
样例输入
7 3
样例输出
4 {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}

给定一个正整数n,将其拆分成k个正整数的和,求方案数。这里使用了深度优先搜索的方法,从min开始枚举每个数,递归求解。其中,fanan表示当前的方案,ans表示方案数,cnt表示调用次数。

public class A {
	public static int cnt;//调用次数
	public static int ans;//方案数
    public static void main(String[] args) {
    	int n=7;//给定的正整数
    	int k=3;//将其拆分成k个正整数的和
    	dfs(n,k,1,"");//从1开始枚举每个数
    	System.out.println("方案数:"+ans);//输出方案数
    	System.out.println("调用次数:"+cnt);//输出调用次数
    	


    }

	/**
	 * 深度优先搜索
	 * @param n 给定的正整数
	 * @param k 将其拆分成k个正整数的和
	 * @param min 枚举的最小值
	 * @param fanan 当前的方案
	 */
	private static void dfs(int n, int k, int min, String fanan) {
		cnt++;//调用次数加1
		if(k==1 && min<=n) {//如果k=1且min<=n
			ans++;//方案数加1
			System.out.println(fanan+n);//输出方案
			return ;
		}
		if(min*k>n) return ; //剪枝
		for (int i = min; i < n; i++) {//枚举每个数i
			dfs(n-i,k-1,i,fanan+i+"+");//递归搜索
		}
		
	}

}
1+1+5
1+2+4
1+3+3
2+2+3
方案数:4
调用次数:15

5.图书推荐

你是否发现,购物、短视频、资讯等平台背后的智能推荐算法,不断分析着你的购物偏好和浏览习惯;价格算法时刻计算调整着你能购买到的商品价位;导航算法、网约车平台算法和无人驾驶汽车算法等等,时刻影响着我们的出行……

无论是否愿意,我们的生活已被算法包围。为了帮助大家全面认知我们当前所身处的世界,消弭技术发展过快带来的困扰与隐忧,《人人都离不开的算法——图解算法应用》一方面从人工智能算法的五大核心应用领域—公共、商业、医疗、工业、金融的典型场景出发,以通俗化、故事化和漫画化的具体事例,深入解读算法是如何在各行各业具体发挥作用和对日常生活的影响;另一方面,将从算法的责任监管和立法治理等角度,阐述算法开发与应用者们应该如何守好伦理底线,让科技向善而行。

《人人都离不开的算法——图解算法应用》脉络清晰,图文并茂,无论你是工作中会接触到算法应用的从业人员,还是对算法应用感到好奇的小白,本书都有助于你打开视野,看到算法在实际应用中的波澜壮阔。

有关【蓝桥杯-筑基篇】搜索的更多相关文章

  1. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  2. ruby - 如何搜索有用的 ruby - 2

    寻找有用的ruby的好网站是什么? 最佳答案 AgileWebDevelopment列出插件(虽然不是ruby​​gems,我不确定为什么),并允许人们对它们进行评级。RubyToolbox按类别列出gem并比较它们的受欢迎程度。Rubygems有一个搜索框。StackOverflow对最有用的rails插件和ruby​​gems有疑问。 关于ruby-如何搜索有用的ruby,我们在StackOverflow上找到一个类似的问题: https://stacko

  3. ruby - 如何搜索、递增和替换 Ruby 字符串中的整数子字符串? - 2

    我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/

  4. ruby - Ruby 中的必应搜索 API - 2

    我读了"BingSearchAPI-QuickStart"但我不知道如何在Ruby中发出这个http请求(Weary)如何在Ruby中翻译“Stream_context_create()”?这是什么意思?"BingSearchAPI-QuickStart"我想使用RubySDK,但我发现那些已被弃用前(Rbing)https://github.com/mikedemers/rbing您知道Bing搜索API的最新包装器(仅限Web的结果)吗? 最佳答案 好吧,经过一个小时的挫折,我想出了一个办法来做到这一点。这段代码很糟糕,因为它是

  5. Ruby#index 方法 VS 二进制搜索 - 2

    给定一个元素和一个数组,Ruby#index方法返回元素在数组中的位置。我使用二进制搜索实现了我自己的索引方法,期望我的方法会优于内置方法。令我惊讶的是,内置的在实验中的运行速度大约是我的三倍。有Rubyist知道原因吗? 最佳答案 内置#indexisnotabinarysearch,这只是一个简单的迭代搜索。但是,它是用C而不是Ruby实现的,因此自然可以快几个数量级。 关于Ruby#index方法VS二进制搜索,我们在StackOverflow上找到一个类似的问题:

  6. ruby - 使用 Ransack 搜索枚举字段 - 2

    我有一个表,'jobs'和一个枚举字段'status'。status具有以下枚举集:enumstatus:[:draft,:active,:archived]使用ransack,我如何过滤表,比如说,所有事件记录? 最佳答案 你可以像这样在模型中声明自己的掠夺者:ransacker:status,formatter:proc{|v|statuses[v]}do|parent|parent.table[:status]end然后您可以使用默认的搜索语法_eq来检查相等性,如下所示:Model.ransack(status_eq:'ac

  7. ruby-on-rails - Rails 4 postgres 全文搜索错误(范围) - 2

    我一直在使用postgres关注railscast的全文搜索,但我不断收到以下错误#的未定义局部变量或方法“作用域”我关注了railscast确切地。我安装了所有正确的gem。(pg_search,pg)。这是我的代码文章Controller(我在这里也使用acts_as_taggable)defindex@articles=Article.text_search(params[:query]).page(params[:page]).per_page(3)ifparams[:tag]@articles=Article.tagged_with(params[:tag])else@art

  8. ruby - 如何使用部分字符串搜索数组并返回索引? - 2

    我想使用部分字符串搜索数组,然后获取找到该字符串的索引。例如:a=["Thisisline1","Wehaveline2here","andfinallyline3","potato"]a.index("potato")#thisreturns3a.index("Wehave")#thisreturnsnil使用a.grep将返回完整的字符串,使用a.any?将返回正确的true/false语句,但都不会返回匹配的索引找到了,或者至少我不知道该怎么做。我正在编写一段代码,该代码读取文件、查找特定header,然后返回该header的索引,以便它可以将其用作future搜索的偏移量。如果

  9. 蓝桥杯备赛(二) - 2

    目录前言: 一、ASC分析代码实现二、 卡片分析代码实现三、 直线分析代码实现四、货物摆放分析代码实现小结:前言:  在刷题的过程中,发现蓝桥杯的题目和力扣的差别很大。让人有一种不一样的感觉,蓝桥杯题目偏向对于实际问题用编程去的解决,而力扣给人感觉很锻炼自己的编程思维,逻辑能力。两者结合去刷,相信会有不一样的收获。 一、ASC  已知大写字母A的ASCII码为65,请问大写字母L的ASCII码是多少?分析  这道题目看上去很简单,我们需确定自己计算的准确,所以我建议用编程去解决。代码实现publicclassTest8{publicstaticvoidmain(String[]args){Sy

  10. ruby-on-rails - 自动完成搜索的 Rails 实现 - 2

    我不确定如何为我的搜索功能添加自动完成表单。"get"do%>nil%>我有一个具有自定义操作的Controllerdefquery@users=Search.user(params[:query])@article=Search.article(params[:query])end模型如下:defself.user(search)ifsearchUser.find(:all,:conditions=>['first_nameLIKE?',"%#{search}%"])elseUser.find(:all)endenddefself.article(search)ifsearchArt

随机推荐