導航:首頁 > 源碼編譯 > java熱度排名演算法

java熱度排名演算法

發布時間:2023-05-10 09:43:19

java演算法面試題:排序都有哪幾種方法

一、冒泡排序
[java] view plain
package sort.bubble;
import java.util.Random;
/**
* 依次比較相鄰的兩個數,將小數放在前面,大數放在後面
* 冒泡排序,具有穩定性
* 時間復雜度為O(n^2)
* 不及堆排序,快速排序O(nlogn,底數為2)
* @author liangge
*
*/
public class Main {
public static void main(String[] args) {
Random ran = new Random();
int[] sort = new int[10];
for(int i = 0 ; i < 10 ; i++){
sort[i] = ran.nextInt(50);
}
System.out.print("排序前的數組為");
for(int i : sort){
System.out.print(i+" ");
}
buddleSort(sort);
System.out.println();
System.out.print("排序後的數組為");
for(int i : sort){
System.out.print(i+" ");
}
}
/**
* 冒泡排序
* @param sort
*/
private static void buddleSort(int[] sort){
for(int i=1;i<sort.length;i++){
for(int j=0;j<sort.length-i;j++){
if(sort[j]>sort[j+1]){
int temp = sort[j+1];
sort[j+1] = sort[j];
sort[j] = temp;
}
}
}
}
}
二、選擇排序
[java] view plain
package sort.select;
import java.util.Random;
/**
* 選擇排序
* 每一趟從待排序的數據元素中選出最小(或最大)的一個元素,
* 順序放在已排好序的數列的最後,直到全部待排序的數據元素排完。
* 選擇排序是不穩定的排序方法。
* @author liangge
*
*/
public class Main {
public static void main(String[] args) {
Random ran = new Random();
int[] sort = new int[10];
for (int i = 0; i < 10; i++) {
sort[i] = ran.nextInt(50);
}
System.out.print("排序前的數組為");
for (int i : sort) {
System.out.print(i + " ");
}
selectSort(sort);
System.out.println();
System.out.print("排序後的數組為");
for (int i : sort) {
System.out.print(i + " ");
}
}
/**
* 選擇排序
* @param sort
*/
private static void selectSort(int[] sort){
for(int i =0;i<sort.length-1;i++){
for(int j = i+1;j<sort.length;j++){
if(sort[j]<sort[i]){
int temp = sort[j];
sort[j] = sort[i];
sort[i] = temp;
}
}
}
}
}
三、快速排序
[java] view plain
package sort.quick;
/**
* 快速排序 通過一趟排序將要排序的數據分割成獨立的兩部分, 其中一部分的所有數據都比另外一部分的所有數據都要小,
* 然後再按此方法對這兩部分數據分別進行快速排序, 整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
* @author liangge
*
*/
public class Main {
public static void main(String[] args) {
int[] sort = { 54, 31, 89, 33, 66, 12, 68, 20 };
System.out.print("排序前的數組為:");
for (int data : sort) {
System.out.print(data + " ");
}
System.out.println();
quickSort(sort, 0, sort.length - 1);
System.out.print("排序後的數組為:");
for (int data : sort) {
System.out.print(data + " ");
}
}
/**
* 快速排序
* @param sort 要排序的數組
* @param start 排序的開始座標
* @param end 排序的結束座標
*/
public static void quickSort(int[] sort, int start, int end) {
// 設置關鍵數據key為要排序數組的第一個元素,
// 即第一趟排序後,key右邊的數全部比key大,key左邊的數全部比key小
int key = sort[start];
// 設置數組左邊的索引,往右移動判斷比key大的數
int i = start;
// 設置數組右邊的索引,往左移動判斷比key小的數
int j = end;
// 如果左邊索引比右邊索引小,則還有數據沒有排序
while (i < j) {
while (sort[j] > key && j > start) {
j--;
}
while (sort[i] < key && i < end) {
i++;
}
if (i < j) {
int temp = sort[i];
sort[i] = sort[j];
sort[j] = temp;
}
}
// 如果左邊索引比右邊索引要大,說明第一次排序完成,將sort[j]與key對換,
// 即保持了key左邊的數比key小,key右邊的數比key大
if (i > j) {
int temp = sort[j];
sort[j] = sort[start];
sort[start] = temp;
}
//遞歸調用
if (j > start && j < end) {
quickSort(sort, start, j - 1);
quickSort(sort, j + 1, end);
}
}
}
[java] view plain
/**
* 快速排序
*
* @param a
* @param low
* @param high
* voidTest
*/
public static void kuaisuSort(int[] a, int low, int high)
{
if (low >= high)
{
return;
}
if ((high - low) == 1)
{
if (a[low] > a[high])
{
swap(a, low, high);
return;
}
}
int key = a[low];
int left = low + 1;
int right = high;
while (left < right)
{
while (left < right && left <= high)// 左邊向右
{
if (a[left] >= key)
{
break;
}
left++;
}
while (right >= left && right > low)
{
if (a[right] <= key)
{
break;
}
right--;
}
if (left < right)
{
swap(a, left, right);
}
}
swap(a, low, right);
kuaisuSort(a, low, right);
kuaisuSort(a, right + 1, high);
}
四、插入排序
[java] view plain
package sort.insert;
/**
* 直接插入排序
* 將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據
* 演算法適用於少量數據的排序,時間復雜度為O(n^2)。是穩定的排序方法。
*/
import java.util.Random;
public class DirectMain {
public static void main(String[] args) {
Random ran = new Random();
int[] sort = new int[10];
for (int i = 0; i < 10; i++) {
sort[i] = ran.nextInt(50);
}
System.out.print("排序前的數組為");
for (int i : sort) {
System.out.print(i + " ");
}
directInsertSort(sort);
System.out.println();
System.out.print("排序後的數組為");
for (int i : sort) {
System.out.print(i + " ");
}
}
/**
* 直接插入排序
*
* @param sort
*/
private static void directInsertSort(int[] sort) {
for (int i = 1; i < sort.length; i++) {
int index = i - 1;
int temp = sort[i];
while (index >= 0 && sort[index] > temp) {
sort[index + 1] = sort[index];
index--;
}
sort[index + 1] = temp;
}
}
}
順便添加一份,差不多的
[java] view plain
public static void charuSort(int[] a)
{
int len = a.length;
for (int i = 1; i < len; i++)
{
int j;
int temp = a[i];
for (j = i; j > 0; j--)//遍歷i之前的數字
{
//如果之前的數字大於後面的數字,則把大的值賦到後面
if (a[j - 1] > temp)
{
a[j] = a[j - 1];
} else
{
break;
}
}
a[j] = temp;
}
}
把上面整合起來的一份寫法:
[java] view plain
/**
* 插入排序:
*
*/
public class InsertSort {
public void sort(int[] data) {
for (int i = 1; i < data.length; i++) {
for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) {
swap(data, j, j - 1);
}
}
}
private void swap(int[] data, int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
五、順便貼個二分搜索法
[java] view plain
package search.binary;
public class Main {
public static void main(String[] args) {
int[] sort = {1,2,3,4,5,6,7,8,9,10};
int mask = binarySearch(sort,6);
System.out.println(mask);
}
/**
* 二分搜索法,返回座標,不存在返回-1
* @param sort
* @return
*/
private static int binarySearch(int[] sort,int data){
if(data<sort[0] || data>sort[sort.length-1]){
return -1;
}
int begin = 0;
int end = sort.length;
int mid = (begin+end)/2;
while(begin <= end){
mid = (begin+end)/2;
if(data > sort[mid]){
begin = mid + 1;
}else if(data < sort[mid]){
end = mid - 1;
}else{
return mid;
}
}
return -1;
}
}

㈡ Java項目中有按時間排序(可正序,可倒敘),熱度排序(可正序,可倒敘)該怎麼做

數據是存在資料庫中,可以通過sql查詢實現數據的排序
數據存儲在redis中,通過zset實現排序

㈢ 關於熱度演算法

熱度演算法基本原理

需要了解的是,熱度演算法也是需要不斷優化去完善的,基本原理:

新聞熱度分 = 初始熱度分 + 用戶交互產生的熱度分 – 隨時間衰減的熱度分

Score = S0 + S(Users) – S(Time)

新聞入庫後,系統為之賦予一個初始熱度值,該新聞就進入了推薦列表進行排序;隨著新聞不斷被用戶點擊閱讀,收藏,分享等,這些用戶行為被視作幫助新聞提升熱度,系統需要為每一種新聞賦予熱度值;同時,新聞是有較強時效性的內容,因此新聞發布之後,熱度必須隨著新聞變得陳舊而衰減。

新聞的熱度就在這些演算法的綜合作用下不斷變化,推薦列表的排序也就不斷變化。

初始熱度不應該一致

上面的演算法為每一條入庫的新聞賦予了同樣的熱度值,但在現實使用後發現行不通,例如娛樂類別比文化類別受歡迎程度本身就高很多;或者突發了嚴重的災害或事故;或是奧運會期間,體育類別的關注度突然高了起來;而此時如果還是每條新聞給同樣的熱度就不能貼合實際了。

解決辦法就是把初始熱度設置為變數:

(1)按照新聞類別給予新聞不同的初始熱度,讓用戶關注度高的類別獲得更高的初始熱度分,從而獲得更多的曝光,例如:

(2)對於重大事件的報道,如何讓它入庫時就有更高的熱度,我們採用的是熱詞匹配的方式。

即對大型新聞站點的頭條,Twitter熱點,競品的頭條做監控和扒取,並將這批新聞的關鍵詞維護到熱詞庫並保持更新;每條新聞入庫的時候,讓新聞的關鍵詞去匹配熱詞庫,匹配度越高,就有越高的初始熱度分。

這樣處理後,重大事件發生時,蘆衡基Twitter和門戶網站的爭相報道會導致熱詞集中化,所有匹配陪謹到這些熱詞的新聞,即報道同樣事件的新聞,會獲得很高的初始熱度分。

用戶行為分規則不是固定不變的

解決了新聞入庫的攔雹初始分之後,接下來是新聞熱度分的變化。先要明確用戶的的哪些行為會提高新聞的熱度值,然後對這些行為賦予一定的得分規則。例如對於單條新聞,用戶可以點擊閱讀(click),收藏(favor),分享(share),評論(comment)這四種行為,我們為不同的行為賦予分數,就能得到新聞的實時用戶行為分為:

S(Users) = 1*click + 5*favor + 10*comment + 20*share

這里對不同行為賦予的分數為1,5,10,20,但這個值不能是一成不變的;當用戶規模小的時候,各項事件都小,此時需要提高每個事件的行為分來提升用戶行為的影響力;當用戶規模變大時,行為分也應該慢慢降低,因此做內容運營時,應該對行為分不斷調整。

當然也有偷懶的辦法,那就是把用戶規模考慮進去,算固定用戶數的行為分,即:

S(Users) = (1*click + 5*favor + 10*comment + 20*share)/DAU * N(固定數)

這樣就保證了在不同用戶規模下,用戶行為產生的行為分基本穩定。

熱度隨時間的衰減不是線性的

由於新聞的強時效性,已經發布的新聞的熱度值必須隨著時間流逝而衰減,並且趨勢應該是衰減越來越快,直至趨近於零熱度。換句話說,如果一條新聞要一直處於很靠前的位置,隨著時間的推移它必須要有越來越多的用戶來維持。

我們要求推薦給用戶的新聞必須是24h以內,所以理論上講,衰減演算法必須保證在24h後新聞的熱度一定會衰減到很低,如果是線性衰減,當某些新聞突然有大量用戶閱讀,獲得很高的熱度分時,可能會持續排名靠前很久,讓用戶覺得內容更新過慢。

參考牛頓冷卻定律,時間衰減因子應該是一個類似於指數函數:

T(Time) = e ^ (k*(T1 – T0))

其中T0是新聞發布時間,T1是當前時間。

而由於熱度的發展最終是一個無限趨近於零熱度的結果,最終的新聞的熱度演算法也調整為:

Score = ( S0(Type) + S(Users) ) / T(Time)

其他影響因素

很多新聞產品會給用戶「贊」,「踩」或「不在推薦此類」的選項,這些功能不僅適用於個性化推薦,對熱度演算法也有一定的作用。

新聞的推送會造成大量的打開,在計算熱度的時候需要排除掉相關的影響。類似於這樣的因素,都會對熱度演算法產生影響,因此熱度演算法上線後,依然需要不斷地「調教」。建議把所有的調整指標做成可配項,例如初始熱度分,行為事件分,衰減因子等,從而讓產品和運營能實時調整和驗證效果,達到最佳狀態。

㈣ 個性化推薦演算法

隨著演算法的普及,大量的產品有了個性化推薦的功能,這也成為內容類產品的標配。個性化定製化逐漸成為了互聯網思維的新補充,被提升到了越來越重要的地位。演算法推薦經過了很長一段時間的發展,才逐漸達到能給用戶驚喜的階段。比如在電商領域,推薦演算法可以挖掘用戶潛在購買需求,縮短用戶選取商品的時間,提升用戶的購物體驗;在新聞或段視頻領域,推薦演算法可以推送用戶喜歡的內容,提高用戶的閱讀效率,減少用戶選擇內容的時間,也增加了用戶在產品上的停留時長。

演算法應用階段

內容類產品發展初期,推薦演算法一般為「熱度演算法」,就是系統把熱點內容優先推薦送給用戶,完成熱點內容的高閱讀率。在積累了一定的用戶數據後,會發現用戶閱讀內容過於集中於熱點信息,長尾信息中的優質資源往往被忽略,造成資源浪費。「千人一面」的狀況已不是一個優質的解決方案,所以演算法逐漸演變為「個性化推薦」,也就是協同過濾的方法論支撐下的一種演算法。協同過濾能很好的根據用戶的喜好,推薦匹配的內容,減少資源浪費,增加用戶使用的友好體驗。真正做到「千人千面」。

推薦演算法的信息來源

第三方數據

一個新系統在初期沒有數據積累的情況下,可與第三方合作,互授部分信息共享。比如,很多系統支持微信登陸,這時候可以獲取客戶的微信信息,生活地點,部分生活習慣等。同時會獲取用戶的社交信息,共同好友越多表明圈子越相似,可以推薦更多相似的內容。

用戶行為數據

記錄用戶在系統內的使用習慣,可以准確的描述單個用戶的行為特徵,愛好特徵等有效的信息,系統根據提取出的分析結果,將內容與之匹配,完成更精準的推薦。如,某用戶經常瀏覽體育信息,系統將對應推薦更多體育相關的咨詢,省去用戶搜索篩選的時間。

基於生活習慣

基於生活習慣,生活常識的推薦,往往也可以作為內置的一個信息來源途徑。比如,外賣的app推薦用戶的餐廳,一般默認是位置優先,就近推薦,如果是快中午的時間段使用,系統默認推薦午餐,其次是晚餐。靠生活常識作出的系統演算法,可以更符合人類的習慣,給用戶更好的體驗。

熱度演算法

熱度演算法簡單的說就是把最核心的內容優先推薦,用新聞舉例,每一條新聞都具有實效性,隨著時間的推移,該條新聞的關注度降低,關注點被新的熱點新聞取代。量化以上的過程,把各個影響因素設定為變數,會得出以下的公式:

新聞熱度=初始熱度分+用戶交互熱度分-衰減熱度分

初始熱度分為新聞產生時,系統對新聞主體的預判熱度值。預判的分值一般為以下兩種模式,一種情況,按照新聞類別的不同,娛樂新聞大於財經新聞,大於國際新聞,大於文化新聞等等系統的預設,依次給出不同的初始熱度分;另一種情況,系統預置熱詞詞庫,用新聞的關鍵詞和詞庫的去匹配,匹配度高的,初始熱度分高。

用戶的交互熱度分也是一個變數,先要明確用的哪些行為會影響新聞熱度,然後對這些行為量化,加權或打分等方式。例如,網易雲音樂,用戶的聽歌,重復循環,收藏,評論,分享等行為,系統為每一種行為打分,求和後得出用戶交互的熱度分:

用戶交互熱度分=聽歌X10+循環X5+收藏X10+評論X5+分享X3

此公式還可以繼續細化,每一種操作的分值也可以作為變數,在產品前期時,傳播產品為主要任務,所以分享的加權要大一些,隨著網易雲的發展,社區的概念逐漸強化,評論區互動的加權會加大,所以評論的分值會增加,系統隨時調整分數加權,得出更准確的用戶交互的影響值。

衰減熱度分是一個隨時間變化而變化的數值,往往是一個函數的表達。用新聞舉例,新聞的熱度會隨著時間的推移而衰減,並且趨勢是越來越快,人們在接受新的熱點後,迅速忘記「舊聞」,直至熱度趨近於零。根據理論數據,構建函數,准確的表達衰減分值。

還有很多其他的影響因素,比如傳播次數,傳播層數,停留時長等等,都會影響熱度值,要想更精準的表達,就需要把涉及到的因素都作為變數,不斷完善演算法,才能更精準的完成推薦。

個性化推薦演算法

隨著用戶量的增加,產品日活的增加,用戶也不能僅限於千人一面熱點閱讀的模式中,個性化推薦在此時顯得尤為重要。個性化推薦有兩種常見的解決方案,一種是基於內容的推薦演算法,推薦內容往往是根據用戶的使用習慣得來,較為精準;另一種是基於用戶的協同推薦演算法,系統會根據以往使用內容,為用戶建模,然後根據群體中個體的使用習慣,推薦更多超預期的內容,達到預測推薦的效果。

基於內容的推薦演算法-預期內

基於內容的推薦演算法,靠收集用戶的使用習慣,進而推薦相關的內容。系統使用分詞庫匹配、關鍵詞匹配等等方式,達到內容的匹配,做到內容的精確劃分。比如,用戶瀏覽了某部科幻電影,系統就會按照該電影所對應的標簽,如科幻,然後系統推薦相同標簽的影片給用戶。

這樣的推薦方案,確定性強,推薦的內容都是根據用戶的歷史來確定,不能挖掘用戶的潛在需求。

基於用戶的協同推薦-超預期

做到精準推薦後,系統會繼續挖掘更潛在的推薦需求,給用戶超預期的推薦體驗。這就到了基於用戶協同推薦的階段。簡單的說,這種演算法是增加了用戶建模的環節,將同標簽的用戶群分,對比群體中單個個體的特徵,默認這種特徵為這類人的潛在特徵,再將此特徵內容推薦給同標簽的用戶,達到超預期的推薦效果。

比如,某用戶購買了一個蘋果手機,系統會將此用戶歸類為果粉,系統識別出很多果粉除了買蘋果的商品,還會購買小米作為備用機,這個特徵會被系統識別為潛在需求,推薦給果粉,減少果粉選擇備用機的時間。

這樣的推薦演算法,不僅能完成精準的推薦,還能給用戶小驚喜,讓系統「有溫度」。但是這樣的推薦方式,往往需要積累了大量用戶資料為基礎,才可以精確的完成。

㈤ java搜索熱度問題

要是全是1位數字的話,建立int[] count = int[10]數組
將字元串數組進行判斷(switch、case),如果是1,count[1]++;如果是9,count[9]++……
循環完之後,檢查count數組哪個最大(也尺喚塌是一個循環)
int max = 0;//出現次陵圓數最多的數
int temp = count[0];//出現最多的次數
for(int i = 0;i<count.length;i++){
if (count[i] > temp){
temp = count[i];
max = i;
}
}
System.out.println(max+"出現次數做多,出現了"+temp+"次"鏈辯);

㈥ java中的演算法,一共有多少種,哪幾種,怎麼分類。

就好比問,漢語中常用寫作方法有多少種,怎麼分類。

演算法按用途分,體現設計目的、有什麼特點
演算法按實現方式分,有遞歸、迭代、平行、序列、過程、確定、不確定等等
演算法按設計范型分,有分治、動態、貪心、線性、圖論、簡化等等

作為圖靈完備的語言,理論上」Java語言「可以實現所有演算法。
「Java的標准庫'中用了一些常用數據結構和相關演算法.

像apache common這樣的java庫中又提供了一些通用的演算法

㈦ Java演算法設計:迭代器實現排序(求各位大佬各抒己見)

public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int e = arr.length - 1; e > 0; e--) {
for (int i = 0; i < e; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1);
}
}
}
}

㈧ 關於java新聞網站的演算法

(一)演算法倫理的研究

1.演算法內涵界定。演算法源於數學,但現代演算法又遠遠不止於傳統數學的計算范疇。演算法多被理解為是計算機用於解決問題的程序或步驟,是現代人工智慧系統的運行支柱。《計算主義:一種新的世界觀》(李建會等,2012)中將演算法定義為能行的方法,在外界的常識性理解中所謂演算法就是能感受到的一套運算規則,這個規則的特點在於運算時間的有限性、計算步驟的有窮性、輸入結果的確切性,它是機械步驟或能行可算計程序。該定義點明了演算法應具備的兩個基本屬性—或侍李—有限性與有窮性。《用計算的觀點看世界》(酈全民,2016)則從信息傳播的角度解讀演算法,認為演算法實質上是信息處理方法。

2.演算法倫理研究

倫理關乎道德價值真理及其判斷。存在於自然界、社會中的人,其行為應遵循一定的倫理道德規范。倫理的效應要導向善。倫理道德關注對個體存在的尊重、個體的自由、公平正義以及組織團體的延續與發展等問題。在一定程度上可以說,當今的人類社會已經不能脫離智能演算法系統而運行了。

演算法無時無處不在對世界產生影響,因而演算法也會必然的觸碰到倫理道德。和鴻鵬(2017)已指出,演算法系統在人類社會生活中的廣泛應用,會陷入諸多如人類面臨且無法迴避的倫理兩難選擇困境之中。而當演算法與倫理發生關聯時,學界一般認為會引出職業倫理和技術倫理兩種倫理問題。

職業倫理主要與演算法系統的開發者有關,指開發者是帶有個性價值觀、倫理道德觀去研發演算法系統的行為體,因而演算法系統一開始便會摻雜著設計人主觀性的倫理道德觀。設計者出於何種目的開發某演算法系統、面對不同問題設計者持有的倫理道德態度,這些衫遲都會在演算法系統的運行中得到體現。

技術倫理是演算法系統在一定意義上可稱之為一種科學技術,這種技術自身及其運作結果都會負載著倫理價值。其實在一些情況下,職業倫理與技術倫理之間並沒有很明確的界別,關於這一點,劉則淵跟王國豫已做過論述。

本文將主要從技術倫理的角度對演算法關涉倫理這一問題嘗試做深入研究。

(二)網路新聞傳播的演算法倫理研究

演算法與技術的融合不斷英語於網路新聞傳播領域中,從數據新聞到機器寫作,從演算法推送到輿情到分析,國內新聞傳媒領域的機器新聞和相關研究逐漸發展,金兼斌在《機器新聞寫作:一場正在發生的革命》(2014),作者較早的將眼光聚焦於基於演算法的新聞內容生產和編輯。認為在自動化新聞生產大發展的前提下,諸如新聞生產或分發中勞動密集型的基礎性工作與環節都將被技術取代。張超、鍾新在《從比特到人工智慧:數字新聞生產的演算法轉向》(2017)認為演算法正在從比特形式走向人工智慧階段,這種轉向使得數字新聞與傳統新聞的邊界進一步明晰,促使數字新聞生產也產生了變革。胡萬鵬在《智能演算法推薦的倫理風險及防範策略》中總結了從演算法推送方面:針對新聞的價值觀所受到的負面影響;以及新聞的公共性、客觀性和真實性受到的削弱進行分析;從受眾方面:將具體對信息繭房現象以及受眾的知情權和被遺忘權展開探討;從社會影響方面,則針對社會群體、社會公共領域和社會文化所受到的消極影響展開論述。

根據以上文獻的梳理可以看出,國內目前對網路新聞傳播的演算法倫理研究主要集中在新聞業態演算法倫理失范的相關問題,因為與其他失范問題相比,這是比較容易發現的。但目前關於網路新聞傳播的演算法倫理的國內研究還存在不足:國內算談棚法倫理和網路新聞傳播演算法倫理的研究還是在起步階段,比較成熟的系統性研究還未出現;關於演算法開發人員和平台的責任機制的研究都比較薄弱,總上所述,演算法推送新聞的倫理問題研究是有必要繼續加強的。

2.新聞推薦演算法的興起、發展與原理

2.1新聞推薦演算法的興起

隨著計算機技術的信息處理的維度越來越高,信息處理的能力不斷提升,演算法技術可以從大數據中篩選出用戶最關心最感興趣的信息,改變了原有的新聞信息傳播方式,重塑了新的媒介生態和傳播格局。

但反過來看,在人人都能生產信息的背景下,信息的生產、傳播和反饋的速度都是呈幾何倍數增長,用戶面對的信息越來越多。由於設備的局限性和信息海量,用戶無法集中注意力看自己感興趣的內容,也無法及時抓取對自己有用的信息,於是出現了「注意力經濟」。美國經濟學家邁克爾·戈德海伯(1997)認為,當今社會是一個信息極大豐富甚至泛濫的社會,而互聯網的出現,加快了這一進程,信息非但不是稀缺資源,相反是過剩的。相對於過剩的信息,只有一種資源是稀缺的,那就是人們的注意力。換句話說,信息不能夠一味追求量,還要有價值,價值就在於用戶對信息的注意力,誰獲得了用戶的注意力就可以有市場的發展空間,通過「販賣」用戶的注意力能夠使新媒體聚合平台獲得利潤,維持發展。再加上現在生活節奏越來越快,人們對信息獲取的量和效率要求提高,不想把時間浪費在自己不感興趣的信息,從而用戶獲取信息的「個性化」特徵變得明顯起來。

基於此背景下,演算法推送新聞的傳播機制應運而生,用戶不需要特意搜索自己需要的信息,而是海量的信息會自行「找到」用戶,為用戶節省搜索時間之餘,又能做到真正為用戶提供有用的信息。

2.2新聞推薦演算法的發展現狀

演算法推薦是依據用戶數據為用戶推薦特定領域的信息,根據受眾使用反饋不斷修正並完善推薦方案。目前主要有兩類新聞機構使用演算法推送,其一是新型的互聯網新聞聚合類平台,國內主要是以今日頭條和一點資訊等演算法類平台為代表,在我國新聞客戶端市場上擁有極高的佔有率。張一鳴創建今日頭條是依靠大數據和演算法為用戶推薦信息,提供連接人與信息的服務,演算法會以關鍵詞等元素判斷用戶的興趣愛好,從全網抓取內容實現個性化推薦。國外則是以Facebook、Instagram等平台為代表,這些APP都是通過演算法挖掘用戶的數據,以用戶個性化需求為導向對用戶進行新聞推送。另一種則是專業新聞生產的傳統媒體,為積極應對新聞市場的競爭和提高技術水平而轉型到新聞全媒體平台,如國內的「人民日報」等,國外利用演算法推送向用戶推送新聞的傳統媒體則有美國的美聯社、華盛頓郵報和英國的BBC等,他們利用演算法監督受眾的數量還有閱讀行為,使他們的新聞報道能夠更加受受眾的喜歡,增加用戶的粘性。

2.2新聞推薦演算法的原理

2.2.1新聞推薦演算法的基本要素

演算法推送有三個基本要素,分別是用戶、內容和演算法。用戶是演算法推送系統的服務對象,對用戶的理解和認知越是透徹,內容分法的准確性和有效性就越准確。內容是演算法推送系統的基本生產資料,對多種形式內通的分析、組織、儲存和分發都需要科學的手段與方法。演算法是演算法推送技術上的支持,也是最核心的。系統中大量用戶與海量的信息是無法自行匹配的,需要推送演算法把用戶和內容連接起來,在用戶和內容之間發揮橋梁作用,高效把合適的內容推薦給合適的用戶。

2.2.2新聞推薦演算法的基本原理

演算法推送的出現需要具備兩個條件:足夠的信息源和精確的演算法框架。其中,演算法的內容生產源與信息分發最終效果密切相關:是否有足夠多的信息可供抓取與信息是否有足夠的品質令用戶滿意都將對信息的傳播效果產生影響。與此同時,分發環節也在向前追溯,改變著整個傳播的生態。目前,國內新聞傳播領域所使用的演算法推送主要有三大類——協同過濾推送、基於內容推送和關聯規則推送。

協同過濾推送分為基於用戶的協同過濾和基於模型的協同過濾。前者主要考慮的是用戶和用戶之間的相似度,只要找出相似用戶喜歡的新聞文章類別,並預測目標用戶對該文章的喜歡程度,就可以將其他文章推薦給用戶;後者和前者是類似的,區別在此時轉向找到文章和文章之間的相似度,只有找到了目標用戶對某類文章的喜愛程度,那麼我們就可以對相似度高的類似文章進行預測,將喜愛程度相當的相似文章推薦給用戶。因此,前者利用用戶歷史數據在整個用戶資料庫中尋找相似的推送文章進行推薦,後者通過用戶歷史數據構造預測模型,再通過模型進行預測並推送。

基於內容的推送即根據用戶歷史進行文本信息特徵抽取、過濾,生成模型,向用戶推薦與歷史項目內容相似的信息。它的優點之一就是解決了協同過濾中數據稀少時無法准確判斷分發的問題。但如果長期只根據用戶歷史數據推薦信息,會造成過度個性化,容易形成「信息繭房」。

關聯規則推送就是基於用戶歷史數據挖掘用戶數據背後的關聯,以分析用戶的潛在需求,向用戶推薦其可能感興趣的信息。基於該演算法的信息推薦流程主要分為兩個步驟,第一步是根據當前用戶閱讀過的感興趣的內容,通過規則推導出用戶還沒有閱讀過的可能感興趣的內容;第二是根據規則的重要程度,對內容排序並展現給用戶。關聯規則推送的效果依賴規則的數量和質量,但隨著規則數量的增多,對系統的要求也會提高。

2.2.3演算法推送的實現流程

在信息過載的時代,同一個新聞選題有很多同質化的報道,因此分發前需要對新聞內容進行消重,消重後的新聞內容便等待推送,此時的推送有三個類別:啟動推送、擴大推送和限制推送。

3.「今日頭條」新聞推薦演算法分析

「今日頭條」是國內一款資訊類的媒體聚合平台,每天有超過1.2億人使用。從「你關心的,才是頭條!」到如今的「信息創造價值!」,產品slogan的變化也意味著今日頭條正逐漸擺脫以往單一、粗暴的流量思維,而開始注重人與信息的連接,在促進信息高效、精準傳播的同時注重正確的價值引導。

在2018年初,「今日頭條」的資深演算法架構師曹歡歡博士在一場分享交流會上公開了其演算法運行原理。在他的敘述中,非常詳細地介紹了「今日頭條」的演算法推薦系統概述以及演算法推薦系統的操作原理。

3.1.1-1曹歡歡博士的今日頭條演算法建模

上圖用數學形式化的方法去描述「今日頭條」的演算法推送,實際上就是一個能夠得出用戶對內容滿意程度的函數:即y為用戶對內容的滿意度,Xi,Xc,Xu分別是今日頭條公開的演算法推送的三個維度:Xi是用戶,包括用戶的性別、年齡、職業和興趣標簽,還有其他演算法模型刻畫的隱形用戶偏好等;Xc是環境,這也是移動互聯網時代新聞推送的特點,由於用戶隨時隨地在不停移動,移動終端也在移動,用戶在不同的工作場合、旅行等場景信息推送偏好也會不同;Xu是內容,今日頭條本身就是信息聚合類平台,平台上涵蓋各種不同形式的內容。本章將以該函數為基礎,逐一分析今日頭條的推薦演算法。

3.1推薦維度之一:內容分析

內容分析原指第二次世界大戰期間,傳播學家拉斯韋爾等研究學家組織了「戰士通訊研究」的工作,以德國公開出版的戰時報紙為分析研究對象,弄清報紙內容本質性的事實和趨勢,揭示隱含的隱性情報內容,獲取了許多軍情機密情報並且對事態發展作出情報預測。在「今日頭條」中,內容分析則是對文章、視頻內容提取關鍵要素,通過對文本、視頻標題關鍵字進行語義識別,給內容進行分類。「今日頭條」的推送系統是典型的層次化文本分類演算法,來幫助每篇新聞找到合適的分類,比如:第一大分類是政治、科技、財經、娛樂、體育等,體育類可以下分籃球、足球、網球等,足球又可以下分中國足球和國際足球,中國足球最後下分為甲、中超、國家隊等。這一步是對文章進行對這個工作主要目的是對文章進行分類,方便以後對客戶推薦。

想要內容分析實現效果,則需要海量的內容信息給演算法系統提供有效的篩選和分類。「今日頭條」既然是依賴於演算法推送新聞,那它背後的資料庫必然是強大的,「網頁蜘蛛」和「頭條號」就是支撐今日頭條平台消息來源的重要渠道,其消息來源極其豐富,何時何地有何新鮮事,都能高效率抓取信息。

第一個消息來源的渠道是「網頁蜘蛛」,「網頁蜘蛛」又叫網頁爬蟲,頭條使用的就是搜索引擎爬蟲叫「Bytespider」。它能按照一定的規則,自動爬行抓取互聯網的信息或腳本,就像蜘蛛通過蛛網進行捕食,當發現新的信息資源,蜘蛛會立刻出動抓取信息內容並將其收入自己的資料庫中。和微信的垂直搜索不同,Bytespider是能夠抓取全網內容的全新搜索引擎,因此「今日頭條」的搜索引擎功能很全面,搜索的資源很廣,資源包容性極高。

Bytespider信息抓取的基本流程如下:首先是網頁抓取。Bytespider順著網頁中的超鏈接,從這個網站爬到另一個網站,通過超鏈接分析連續訪問抓取更多網頁。被抓取的網頁被稱之為網頁快照。由於互聯網中超鏈接的應用很普遍,理論上,從一定范圍的網頁出發,就能搜集到絕大多數的網頁。第二步是處理網頁。搜索引擎抓到網頁後,還要做大量的預處理工作,才能提供檢索服務。其中,最重要的就是提取關鍵詞,建立索引庫和索引。其他還包括消除重復網頁、判斷網頁類型、分析超鏈接、計算網頁的重要度、豐富度等。第三步提供檢索服務。用戶輸入關鍵詞進行檢索,搜索引擎從索引資料庫中找到匹配該關鍵詞的網頁,為了用戶便於判斷,除了網頁標題和URL外,還會提供一段來自網頁的摘要以及其他信息。

3.2推薦維度之二:用戶分析

用戶分析通過提取用戶的有效數據,如用戶經常瀏覽的文字類型、經常搜索的關鍵字、注冊時登記信息的內容等,演算法系統可以將每個用戶的瀏覽記錄、瀏覽時間、留言、評論和轉發等行為進行關鍵字提取,最終形成用戶畫像,以便之後對用戶進行文章和視頻的精準推送。舉個例子,給喜歡閱讀「體育」的用戶標上「體育」標簽;給喜歡「娛樂」的用戶標上「娛樂」的標簽,這一步的作用是給用戶的興趣進行建模,包括用戶對文章和視頻的全局熱度、分類熱度,主題熱度,以及關鍵詞熱度等。熱度信息在大的推薦系統能夠解決新聞冷啟動問題,幫助新聞實現推送。

用戶分析還具有協同特徵,它可以在部分程度上幫助解決所謂演算法越推越窄的問題。協同特徵也就是「聯想式」的推送方法,並非只考慮用戶已有歷史,而是通過用戶行為分析不同用戶間相似性,比如點擊相似、興趣分類相似、主題相似、興趣詞相似,甚至向量相似,從而擴展模型的探索能力。根據用戶之間計算數據的相似程度,把用戶細化分類成為不同的目標群體,再向目標群體集中的推送其感興趣的新聞內容

內容分析和用戶分析是相輔相成的,如果沒有分析的文本標簽,無法得到用戶興趣標簽,沒有用戶的興趣標簽就無法給用戶定位實現精準推送。

3.3推薦維度之三:環境分析

環境分析就是根據文章的時效性和接近性推送給相應的用戶,比如獲取用戶當前所在位置是否在旅遊區,這個可以通過獲取用戶的實時位置來實現。還會不斷與用戶之前經常出現的所在地進行對比等方式確認當前狀態,分析出用戶是在常住地區還是在旅行。這時若系統檢測到用戶正在泰山及周邊遊玩,則可能會相應推送泰山的相關文章、周邊的交通新聞和天氣信息等等。

通過上面三個推薦維度可以作為數據基礎,分析當前用戶處於什麼環境,結合用戶畫像以及文章的內容分類來推薦,盡量做到推送的內容都是用戶所感興趣的。演算法系統還會通過內容分類、分析抽取,把文本相似度高的文章,包括新聞主題、內容相似的文章進行消重,解決推送重復的問題,進一步對目標用戶進行精確且不重復的內容推薦。最後過濾質量低俗色情的內容,以免造成平台會有負面傾向。

3.4「今日頭條」新聞推薦演算法的價值取向

3.4.1「用戶為上」

「今日頭條」的演算法推送是站在用戶的立場上的,以滿足用戶個性化和推送的精準性,「今日頭條」也重新衡量了新聞價值標准:以用戶為上,用戶對新聞內容和閱讀方式的滿意度便是平台推送新聞的價值宗旨。傳統媒體時代,只有報紙和電視,有什麼受眾就得看什麼,而如今「今日頭條」根據用戶興趣去進行推送。演算法推送平台用戶范圍廣,很多用戶熱衷關注負面,也有許多用戶都有窺視欲和好奇心,喜歡無聊八卦和無聊新聞,而且在好奇心作用下用戶都有從眾心理。這使得生產者過度去迎合受眾,只要是用戶喜歡看就可以發表在「今日頭條」上。

3.4.2「演算法主導」

「今日頭條」更注重技術分發,生產者是用戶,受眾者也是用戶,這樣一來內容監管和分發就很困難。演算法推送機制根據用戶愛好進行推送,這樣生產的內容快、也無疑會加速內容配送效率。在演算法推送模型中,用戶點擊頻率、閱讀時間、點贊評論以及轉發在演算法時代都是可以進行量化的目標。在這樣情況下生產的內容,想要獲得較大點擊率和推送率,需要標題才能吸引用戶,因為用戶在平台一眼能看到的就是標題和配圖。標題和配圖決定用戶是否會打開你的內容,這導致許多內容生產者在編輯新聞標題時陷入標題黨的怪圈,還有導致低俗內容的呈現,以製造沖突製造懸念貼標簽等方式引用戶點擊,意圖把自己的文章做成爆文。對於海量的信息內容,即使今日頭條數據和智能推薦做的再好,目前來說也難以抵擋海量的垃圾信息。

4.演算法推送新聞引發的倫理問題

在如今網路時代的傳播思維中,「用戶為上」、「演算法主導」的新聞價值取向已經在演算法聚合類平台成為了普遍,演算法推送技術作為吸引用戶的手段,搭建起一個充滿誘導的媒介環境,以此增加用戶對平台的粘性。演算法推送技術在獲取信息、傳播速度等方面與以往相比有著跨時代的進步,但與此同時,由於演算法推送技術的加入,衍生出新的倫理問題,並且日漸復雜化。

4.1演算法推送引發的倫理問題

4.1.1演算法推送過於機械化,沒有思考能力

單向的演算法推薦對用戶來說經常會帶來內容雜亂無章、信息量過大、信息價值低等問題。從邏輯講,演算法只是從關鍵字的檢索匹配來完成統計推薦,但對新聞報道或文學作品具有藝術性、專業性的內容來說,是不能保證推送的質量的。演算法方面,目前主要基於匹配檢索與統計,大部分都是個人關注的信息類型和標簽,難以達到較好的推送效果。一千個人眼裡有一千個哈姆雷特,但是計算機只有隻有一個。演算法技術過於注重機械化的統計,只根據關鍵詞來推薦用戶,對我們中國具有博大精深的中國文字文化底蘊,推薦演算法是遠遠不夠的。整個新聞客戶端顯得像是一個菜市場,沒有態度、沒有風格,閱讀感受單一化,呈現了碎片化的特點。新聞不只是讓用戶能夠了解身邊發生的新鮮事,還有宣傳正面思想和傳播正能量的作用,新聞應該還要給人們帶來新的思考。讓機器做出正確判斷很簡單,但是讓機器綜合心理學、社會學、乃至某細分領域內的規則做出判斷還要正確地引導受眾則很難,正如現在演算法技術還不能完成一篇富有人文性、文學性和批判性的深度報道,它止步在了碎片式的、表層的傳播范疇。

4.1.2容易引起「信息繭房」效應

「信息繭房」這一概念是凱斯.桑斯坦在《信息烏托邦》一書中提出的。意指受眾在過度的信息自我選擇之中,這樣會降低接觸外界其他信息的可能,從而將自己的生活桎梏於蠶繭一般的「蠶房」中的現象。人們的信息領域會習慣性被自己的興趣引導,信息窄化帶來了受眾對信息接收的單一性,這種單一性的可能會使受眾陷入循環,加重受眾信息同質化。

4.1.3演算法推送的「偽中立性」

客觀和全面是新聞倫理的基本要求,新聞從業者必須從可好信息源來獲取真實的信息,以客觀的態度反應現實。我們慣常認為,互聯網技術服務商是技術中立者,不需要承擔約束大眾媒體的社會責任,然而當信息把關人又新聞編輯轉變為演算法工程師,傳統的媒介倫理似乎已經失效。演算法具有商業傾向性,「中立性」是演算法平台用以逃避媒體責任的理由,給大眾媒介造成傳播亂象,如此一來更像是一場演算法平台「肆意妄為又不想負責」的詭辯。

演算法平台的信息源是經過選擇和過濾的,「頭條號」的內容占「今日頭條」整個信息系統的絕大部分,然而在「人人都可以做新聞人」的時代,頭條號平台是一個開放的網路媒介環境,存在大量的偏見和錯誤的認知。無論是「今日頭條」平台設立的演算法規則,還是其他爬蟲的抓取的關鍵詞,演算法系統的信息源很多是具有目的性的、有偏見和非客觀的信息,所以信息源不能直接作用於用戶。因此,篩選演算法系統的信息源與傳統的人工編輯相比較,范圍極廣且很難把關,若演算法被惡意利用,那麼使整個傳播系統將會被輕易控制。

4.1.4演算法推送里的「議程設置」

原議程設置功能揭示的重要內涵是:「受眾對新聞的看法雖然被大眾媒體議程設置功能所主導,但其更深刻的是議程設置給大眾媒體新聞帶來放大與延伸,從而使受眾對新聞選擇做出能動性修正,讓受眾在滿足需求和媒介依賴中逐漸培養出的潛在認同感」。

推送演算法技術在互聯網平台的運用,使原來傳統媒體主導的議程設置過程發生了變化,伴隨著傳播權的轉移、公眾參與度的提高和信息量劇增等原因導致議程設置功逐漸能減弱。過往傳統新聞的內容是由編輯有選擇地進行報道後再呈現在受眾面前的,而個性化新聞推送是用戶自己來選擇看哪一方面的內容,而這一環節中,天然的技術賦權將傳播權從傳統媒體下放至平台的用戶,使得受眾和社會的連接無需依賴傳統媒介,新聞媒體作為把關人的作用和議程設置功能都在減弱。

4.2演算法新聞治理缺陷下的演算法權利異化

演算法作為人工智慧的基石之一,是「一種有限、確定、有效並適合用計算機程序來實現的解決問題的方法,是計算機科學的基礎」。近年來,伴隨人工智慧深度學習演算法取得的重大突破和大數據時代的到來,人工智慧的應用場景不斷拓展,人工智慧時代正逐漸從想像成為現實。藉助於海量的大數據和具備強大計算能力的硬體設備,擁有深度學習演算法的人工智慧機器可以通過自主學習和強化訓練來不斷提升自身的能力,解決很多人類難以有效應對的治理難題。伴隨人工能演算法在國家和社會治理中重要性的日漸凸顯,國家和社會對於演算法的依賴也逐漸加深,一種新型的權力形態——演算法權力也隨之出現。

可以把演算法權利分為四種:數據主權、演算法設計權、研發的資本權和演算法控制權。由於前三種權利都是單向的、演算法開發者賦予演算法的權利,是屬於演算法開發者的,與演算法分發平台呈現的效果沒有直接的影響,所以本文將著重論述演算法控制權。

演算法控制權是雙向的,用戶是演算法技術數據行為的提供者,同時又是被演算法技術控制的受害者。例如我們看到「今日頭條」會通過推送演算法來監管用戶的發布和瀏覽行為,同時平台會通過演算法決策系統來實現內容的發布去引導用戶。演算法控制權當然是一種天然技術賦予的權利,但演算法控制權是在用戶提供數據行為的情況下才得以實現的,因此演算法控制權既存在內容生產權,同時有要尊重和保護演算法相對人的義務。

正因為如此,演算法技術被認為是一種雙刃劍,一方面演算法能夠做出精準的行為預測,可以為管理者提供非常好的循環干預機制;對於公共行為主體來說,可以通過對大數據的應用來解決社會治理問題,對於私人主體來說可以藉助數據來提供個性化和定製化的服務;另一方面,演算法技術存在著諸如利益和風險不對稱等問題,而且由於演算法技術發展的超前性,新科技的創造者具備不對稱的信息和技術優勢,能夠按照自身利益的需求來塑造在平台上的演算法推送邏輯和社會系統,這帶來了監管的不確定性。人們要通過集體行為去承擔社會責任,通過這樣的方式規制演算法權利,可以讓我們能夠對演算法分發系統的意義和價值得到更深刻的思考。

㈨ 關於各種排列組合java演算法實現方法

一 利用二進制狀態法求排列組合 此種方法比較容易懂 但是運行喊隱頌效率不高 小數據排列組合可以使用

復制代碼 代碼如下: import java util Arrays;

//利用二進制演算法進行全排列 //count : //count :

public class test { public static void main(String[] args) { long start=System currentTimeMillis(); count (); long end=System currentTimeMillis(); System out println(end start); } private static void count (){ int[] num=new int []{ }; for(int i= ;i<Math pow( );i++){ String str=Integer toString(i ); int sz=str length(); for(int j= ;j< sz;j++){ str=" "+str; } char[] temp=str toCharArray(); Arrays sort(temp); String gl=new String(temp); if(!gl equals(" ")){ continue; } String result=""; for(int m= ;m<str length();m++){ result+=num[Integer parseInt(str charAt(m)+"")]; } System out println(result); } } public static void count (){ int[] num=new int []{ }; int[] ss=new int []{ }; int[] temp=new int[ ]; while(temp[ ]< ){ temp[temp length ]++; for(int i=temp length ;i> ;i ){ if(temp[i]== ){ temp[i]= ; temp[i ]++; } } int []tt=temp clone(); Arrays sort(tt); if(!Arrays equals(tt ss)){ continue; } String result=""; for(int i= ;i<num length;i++){ result+=num[temp[i]]; } System out println(result); } } }

二 用遞歸的思想攜慧來求排列跟組合 代碼量比較大

復制代碼 代碼如下鄭鄭: package practice;

import java util ArrayList; import java util List;

public class Test {

/** * @param args */ public static void main(String[] args) { // TODO Auto generated method stub Object[] tmp={ }; // ArrayList<Object[]> rs=RandomC(tmp); ArrayList<Object[]> rs=cmn(tmp ); for(int i= ;i<rs size();i++) { // System out print(i+"="); for(int j= ;j<rs get(i) length;j++) { System out print(rs get(i)[j]+" "); } System out println(); } }

// 求一個數組的任意組合 static ArrayList<Object[]> RandomC(Object[] source) { ArrayList<Object[]> result=new ArrayList<Object[]>(); if(source length== ) { result add(source); } else { Object[] psource=new Object[source length ]; for(int i= ;i<psource length;i++) { psource[i]=source[i]; } result=RandomC(psource); int len=result size();//fn組合的長度 result add((new Object[]{source[source length ]})); for(int i= ;i<len;i++) { Object[] tmp=new Object[result get(i) length+ ]; for(int j= ;j<tmp length ;j++) { tmp[j]=result get(i)[j]; } tmp[tmp length ]=source[source length ]; result add(tmp); } } return result; } static ArrayList<Object[]> cmn(Object[] source int n) { ArrayList<Object[]> result=new ArrayList<Object[]>(); if(n== ) { for(int i= ;i<source length;i++) { result add(new Object[]{source[i]}); } } else if(source length==n) { result add(source); } else { Object[] psource=new Object[source length ]; for(int i= ;i<psource length;i++) { psource[i]=source[i]; } result=cmn(psource n); ArrayList<Object[]> tmp=cmn(psource n ); for(int i= ;i<tmp size();i++) { Object[] rs=new Object[n]; for(int j= ;j<n ;j++) { rs[j]=tmp get(i)[j]; } rs[n ]=source[source length ]; result add(rs); } } return result; }

}

三 利用動態規劃的思想求排列和組合

復制代碼 代碼如下: package Acm; //強大的求組合數 public class MainApp { public static void main(String[] args) { int[] num=new int[]{ }; String str=""; //求 個數的組合個數 // count( str num ); // 求 n個數的組合個數 count ( str num); }

private static void count (int i String str int[] num) { if(i==num length){ System out println(str); return; } count (i+ str num); count (i+ str+num[i]+" " num); }

private static void count(int i String str int[] num int n) { if(n== ){ System out println(str); return; } if(i==num length){ return; } count(i+ str+num[i]+" " num n ); count(i+ str num n); } }

下面是求排列

復制代碼 代碼如下: lishixin/Article/program/Java/JSP/201311/20148

㈩ java面試有哪些演算法

面試-java演算法題:
1.編寫一個程序,輸入n,求n!(用遞歸的方式實現)。
public static long fac(int n){ if(n<=0) return 0; else if(n==1) return 1; else return n*fac(n-1);
} public static void main(String [] args) {
System.out.println(fac(6));
}
2.編寫一個程序,有1,2,3,4個數字,能組成多少個互不相同且無重復數字的三位數?都是多少?
public static void main(String [] args) { int i, j, k; int m=0; for(i=1;i<=4;i++) for(j=1;j<=4;j++) for(k=1;k<=4;k++){ if(i!=j&&k!=j&&i!=k){
System.out.println(""+i+j+k);
m++;
}
}
System.out.println("能組成:"+m+"個");
}
3.編寫一個程序,將text1.txt文件中的單詞與text2.txt文件中的單詞交替合並到text3.txt文件中。text1.txt文件中的單詞用回車符分隔,text2.txt文件中用回車或空格進行分隔。
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class text{
public static void main(String[] args) throws Exception{
String[] a = getArrayByFile("text1.txt",new char[]{'\n'});
String[] b = getArrayByFile("text2.txt",new char[]{'\n',' '});
FileWriter c = new FileWriter("text3.txt");
int aIndex=0; int bIndex=0;

while(aIndex<a.length){
c.write(a[aIndex++] + "\n");
if(bIndex<b.length)
c.write(b[bIndex++] + "\n");
}

while(bIndex<b.length){
c.write(b[bIndex++] + "\n");
}
c.close();
}

public static String[] getArrayByFile(String filename,char[] seperators) throws Exception{
File f = new File(filename);
FileReader reader = new FileReader(f);
char[] buf = new char[(int)f.length()];
int len = reader.read(buf);
String results = new String(buf,0,len);
String regex = null;
if(seperators.length >1 ){
regex = "" + seperators[0] + "|" + seperators[1];
}else{
regex = "" + seperators[0];
}
return results.split(regex);
}

}
4.639172每個位數上的數字都是不同的,且平方後所得數字的所有位數都不會出現組成它自身的數字。(639172*639172=408540845584),類似於639172這樣的6位數還有幾個?分別是什麼?
這題採用的HashMap結構判斷有無重復,也可以採用下題的數組判斷。
public void selectNum(){
for(long n = 100000; n <= 999999;n++){
if(isSelfRepeat(n)) //有相同的數字,則跳過
continue;
else if(isPingFangRepeat(n*n,n)){ //該數的平方中是否有與該數相同的數字
continue;
} else{ //符合條件,則列印 System.out.println(n);
}
}
} public boolean isSelfRepeat(long n){
HashMap<Long,String> m=new HashMap<Long,String>(); //存儲的時候判斷有無重復值
while(n!=0){ if(m.containsKey(n%10)){ return true;
} else{
m.put(n%10,"1");
}
n=n/10;
} return false;
} public boolean isPingFangRepeat(long pingfang,long n){
HashMap<Long,String> m=new HashMap<Long,String>(); while(n!=0){
m.put(n%10,"1");
n=n/10;
} while(pingfang!=0){ if(m.containsKey(pingfang%10)){ return true;
}
pingfang=pingfang/10;
} return false;
} public static void main(String args[]){ new test().selectNum();
}
5.比如,968548+968545=321732732它的答案里沒有前面兩個數里的數字,有多少這樣的6位數。
public void selectNum(){
for(int n = 10; n <= 99;n++){
for(int m = 10; m <= 99;m++){ if(isRepeat(n,m)){ continue;
} else{
System.out.println("組合是"+n+","+m);
}
}
}
} public boolean isRepeat(int n,int m){ int[] a={0,0,0,0,0,0,0,0,0,0}; int s=n+m; while(n!=0){
a[n%10]=1;
n=n/10;
} while(m!=0){
a[m%10]=1;
m=m/10;
} while(s!=0){ if(a[s%10]==1){ return true;
}
s=s/10;
} return false;
} public static void main(String args[]){ new test().selectNum();
}
6.給定String,求此字元串的單詞數量。字元串不包括標點,大寫字母。例如 String str="hello world hello hi";單詞數量為3,分別是:hello world hi。
public static void main(String [] args) { int count = 0;
String str="hello world hello hi";
String newStr="";
HashMap<String,String> m=new HashMap<String,String>();
String [] a=str.split(" "); for (int i=0;i<a.length;i++){ if(!m.containsKey(a[i])){
m.put(a[i],"1");
count++;
newStr=newStr+" "+a[i];
}
}
System.out.println("這段短文單詞的個數是:"+count+","+newStr);
}
7.寫出程序運行結果。
public class Test1 { private static void test(int[]arr) { for (int i = 0; i < arr.length; i++) { try { if (arr[i] % 2 == 0) { throw new NullPointerException();
} else {
System.out.print(i);
}
} catch (Exception e) {
System.out.print("a ");
} finally {
System.out.print("b ");
}
}
}
public static void main(String[]args) { try {
test(new int[] {0, 1, 2, 3, 4, 5});
} catch (Exception e) {
System.out.print("c ");
}
}

}
運行結果:a b 1b a b 3b a b 5b
public class Test1 { private static void test(int[]arr) { for (int i = 0; i < arr.length; i++) { try { if (arr[i] % 2 == 0) { throw new NullPointerException();
} else {
System.out.print(i);
}
}
finally {
System.out.print("b ");
}
}
}
public static void main(String[]args) { try {
test(new int[] {0, 1, 2, 3, 4, 5});
} catch (Exception e) {
System.out.print("c ");
}
}

}
運行結果:b c
8.單詞數
統計一篇文章里不同單詞的總數。
Input
有多組數據,每組一行,每組就是一篇小文章。每篇小文章都是由小寫字母和空格組成,沒有標點符號,遇到#時表示輸入結束。
Output
每組值輸出一個整數,其單獨成行,該整數代表一篇文章里不同單詞的總數。
Sample Input
you are my friend
#
Sample Output
4
public static void main(String [] args) {
List<Integer> countList=new ArrayList<Integer>(); int count;
HashMap<String,String> m;
String str; //讀取鍵盤輸入的一行(以回車換行為結束輸入) String[] a;

Scanner in=new Scanner(System.in);
while( !(str=in.nextLine()).equals("#") ){
a=str.split(" ");
m=new HashMap<String,String>();
count = 0; for (int i=0;i<a.length;i++){ if(!m.containsKey(a[i]) && (!a[i].equals(""))){
m.put(a[i],"1");
count++;
}
}
countList.add(count);
}s for(int c:countList)
System.out.println(c);
}

閱讀全文

與java熱度排名演算法相關的資料

熱點內容
我的世界國際服為什麼登不進伺服器 瀏覽:994
微盟程序員老婆 瀏覽:928
intellij創建java 瀏覽:110
java連接odbc 瀏覽:38
啟動修復無法修復電腦命令提示符 瀏覽:359
手機編程是什麼 瀏覽:97
山東移動程序員 瀏覽:163
蘇州java程序員培訓學校 瀏覽:476
單片機液晶驅動 瀏覽:854
魔拆app里能拆到什麼 瀏覽:130
新預演算法的立法理念 瀏覽:144
wdcpphp的路徑 瀏覽:134
單片機p0口電阻 瀏覽:926
瀏覽器中調簡訊文件夾 瀏覽:594
五菱宏光空調壓縮機 瀏覽:68
為什麼app佔用幾百兆 瀏覽:680
自動解壓失敗叫我聯系客服 瀏覽:485
易語言新手源碼 瀏覽:458
oa伺服器必須有固定ip地址 瀏覽:46
傳奇源碼分析是什麼 瀏覽:270