回溯算法
回溯算法也叫试探法,是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。在探路的过程中一般使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。从前面对回溯算法的说明可以看到,回溯的本质是穷举,穷举所有可能,然后选出想要的答案,只是在穷举的过程中可以根据一些条件避免无效的遍历,这个避免的过程也叫剪枝。所以回溯法并不是什么很高效的算法,那么既然回溯法并不高效为什么还要用呢?因为一些问题只能靠暴力搜索,没有更高效的解法。
适用场景
组合问题:N个数里面按一定规则找出k个数的集合;
切割问题:一个字符串按一定规则有几种切割方式;
子集问题:一个N个数的集合里有多少符合条件的;
子集排列问题:N个数按一定规则全排列有几种排列方式;
棋盘问题:N皇后,解数独等等。
回溯算法的一般有通用的解题步骤:
1.定义一个解空间,它包含问题的解;2.利用适于搜索的方法组织解空间,一般是个树;3.利用深度优先法搜索解空间;4.利用剪枝函数避免移动到不可能产生解的子空间。
所说的解空间,一般会转化成树(即解空间树),也就是说回溯法解决 ...
快速排序
快速排序使用分治法策略来把一个序列分为较小和较大的2个子序列,然后递归地排序两个子序列。
步骤为:
挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。
选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。
通常明显比其他算法更快,因为它的内部循环可以在大部分的架构上很有效率地达成。
JAVA代码实现:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667public class QuickSort { /* 算法思路: ...
Knuth-Morris-Pratt算法
Knuth-Morris-Pratt算法也就是大家常听到的KMP算法。
如果直接比较文本,如果很多部分与被查部分匹配,算法可能会很慢。KMP采用移位表改进了这种情况。Knuth-Morris-Pratt 算法的思想是移位表的计算,它为我们提供了应该在其中搜索候选模式的信息.该算法的时间复杂度为O(m+n)
12345678910111213141516171819202122232425public static int KnuthMorrisPrattSearch(char[] pattern, char[] text) { int patternSize = pattern.length; int textSize = text.length; int i = 0, j = 0; int[] shift = KnuthMorrisPrattShift(pattern); while ((i + patternSize) <= textSize) { while (text[i + j] == pattern[j] ...
Rabin Karp算法
在介绍Rabin Karp算法前,先看看简单文本搜索算法。
简单文本搜索遍历文本,如果模式的第一个字母匹配,则检查模式的所有字母是否都与文本匹配。如果 m 是要搜索的字母数,n 是被搜索文本中的字母数,则该算法的时间复杂度为 O(m(n-m + 1))。
public static int simpleTextSearch(char[] pattern, char[] text) { int patternSize = pattern.length; int textSize = text.length;
int i = 0;
while ((i + patternSize) <= textSize) {
int j = 0;
while (text[i + j] == pattern[j]) {
j += 1;
if (j >= patternSize)
return i;
}
i += 1;
}
return ...
Android Handler内存泄漏的修复
Android Handler很容易造成内存泄漏,平时工作时也经常遇到。常见的处理方法如下:
使用弱引用(WeakReference):创建一个弱引用到你的Activity或Fragment,这样即使Handler还在运行,也不会导致内存泄漏。
1234567891011121314151617import java.lang.ref.WeakReference; public class MyHandler extends Handler { private final WeakReference<ActivityOrFragment> mActivityOrFragment; public MyHandler(ActivityOrFragment activityOrFragment) { mActivityOrFragment = new WeakReference<>(activityOrFragment); } @Override public void handleMess ...
常见Android内存泄漏的例子
static导致的内存泄漏12345678910111213141516171819public class MainActivity extends AppCompatActivity { private static Bitmap sBitmap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 假设这是一个很大的Bitmap对象,可能由于资源管理不当导致泄露 sBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.large_image); } // 假设这是一个可能导致泄露的方法 public void leakMemory() { ...
Android得到内存信息
Android程序为了排查性能问题,或者做APM,需要监控内存信息,有如下两个方法可以得到内存信息。
使用ActivityManager类获取系统内存信息ActivityManager类提供了获取系统内存信息的功能。你可以通过调用ActivityManager.getMemoryInfo()方法来获取内存信息。
1234567891011121314151617public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SE ...
Android 抓取wifi数据
在Android设备上抓取WiFi数据通常指的是读取WiFi网络的相关信息,如连接到WiFi网络时的SSID、密码等。以下是一个简单的例子,展示如何使用WifiManager类获取当前连接的WiFi网络信息。
首先,在AndroidManifest.xml中添加必要的权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
然后,在代码中,你可以通过以下方式获取WiFi信息:
12345678910111213141516171819202122WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);WifiInfo connectionInfo = wifiManager.get ...
Android透明开发
可用通过修改Activity的窗口属性来实现透明
12345678protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 设置窗口的透明度 getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}
也可以在布局文件中设置背景透明:
12345678<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" ...
Android一个OkHttp请求失败问题
控制台报错:java.io.IOException: unexpected end of stream on …(地址) at okhttp3.internal.http1.Http1ExchangeCodec.readResponseHeaders ,
一开始没有查看日志,长时间未进行网络请求后,再次切换页面并请求数据,便会出现连接失败的问题,猜测是不是Android系统版本比较低,页面长时间未触摸从而导致网络断开,或者是connectTimeout时间设置的问题,待查看日志之后,出现上面的错误。
由此找出两个可能性:1、本地设置的timeout时间大于服务器timeout时间;2、与okhttp和版本都有关系,需要在拦截器中增加一个addHeader(“Connection”,“close”)。
12345678910111213//拦截器内添加addHeader("Connection","close")Request request = chain.request().newBuilder() .addHea ...