जावा स्ट्रिंग में कितने वर्ण हो सकते हैं?


157

मैं कोशिश कर रहा हूँ अगला Palindrome क्षेत्र ऑनलाइन न्यायाधीश (Spoj) जहाँ मैं एक लाख अंक से ऊपर के एक पूर्णांक के लिए विलोमपद खोजने की जरूरत से समस्या। मैंने स्ट्रिंग्स को उलटने के लिए जावा के कार्यों का उपयोग करने के बारे में सोचा, लेकिन क्या वे स्ट्रिंग के लिए लंबे समय तक रहने देंगे?


क्या आप कह रहे हैं कि आपको एक फ़ंक्शन लिखने की ज़रूरत है जो पैलिंड्रॉम उत्पन्न करता है, जिसका आकार उपयोगकर्ता निर्दिष्ट है और लंबाई में 1 मिलियन वर्ण तक हो सकता है?
राबर्ट

3
समस्या (Spoj से) एक 100Gigabyte फ़ाइल हो सकती है, और आप एक बार में एक स्ट्रिंग में लोड करने के लिए पसंद है? गंभीरता से ... कृपया एक स्कैनर का उपयोग करें!
ग्रिम

जवाबों:


242

आपको लंबाई का एक स्ट्रिंग प्राप्त करने में सक्षम होना चाहिए

  1. Integer.MAX_VALUEहमेशा 2,147,483,647 (2 31 - 1)
    (जावा विनिर्देशन द्वारा परिभाषित, एक सरणी का अधिकतम आकार, जिसे स्ट्रिंग वर्ग आंतरिक भंडारण के लिए उपयोग करता है)
    या

  2. Half your maximum heap size(चूंकि प्रत्येक वर्ण दो बाइट्स है) जो भी छोटा है


43
... या आपके अधिकतम ढेर का आकार 2 से विभाजित ... चूंकि चरित्र 2 बाइट्स है
ChssPly76

2
@ ChssPly76: हाँ, यह सही है। मैंने अपना उत्तर संपादित किया, धन्यवाद।
छिपकली

2
मैं अधिकतम आकार कैसे प्राप्त कर सकता हूं? इसके अलावा, मुझे नहीं पता कि मेरी समस्या का परीक्षण करने के लिए जज किस वर्चुअल मशीन का उपयोग कर रहा है, जो JVM निर्भरता की कल्पना का Integer.MAX_VALUE हिस्सा है?
औरंदंद २४'०

6
Integer.MAX_VALUE हमेशा 2147483647 (2 ^ 31 - 1) है, जो जावा स्पेसिफिकेशन का हिस्सा है।
cd1

4
64-बिट JVM को मानते हुए, क्योंकि आपको उस लंबाई की एक स्ट्रिंग को स्टोर करने के लिए 8GB वर्चुअल मेमोरी की आवश्यकता होगी।
रॉबर्ट फ्रेजर

21

मेरा मानना ​​है कि वे 2 ^ 31-1 वर्ण तक के हो सकते हैं, क्योंकि वे एक आंतरिक सरणी द्वारा आयोजित किए जाते हैं, और सरणियों को जावा में पूर्णांकों द्वारा अनुक्रमित किया जाता है।


आंतरिक कार्यान्वयन अप्रासंगिक है - ऐसा कोई कारण नहीं है कि वर्ण डेटा को उदाहरण के लिए लंबे समय तक संग्रहीत नहीं किया जा सकता है। समस्या यह है कि इंटरफ़ेस लंबाई के लिए ints का उपयोग करता है। getBytesऔर इसी तरह की समस्याएं हो सकती हैं यदि आप बहुत बड़े स्ट्रिंग के लिए प्रयास करते हैं।
टॉम हॉकिन -

यह सच है - मैं उस तथ्य को लागू कर रहा था। मेरी गलती।
एपर्किंस

15

जबकि आप Integer.MAX_VALUE वर्ण सिद्धांत में कर सकते हैं, JVM उस सरणी के आकार में सीमित है जो इसका उपयोग कर सकता है।

public static void main(String... args) {
    for (int i = 0; i < 4; i++) {
        int len = Integer.MAX_VALUE - i;
        try {
            char[] ch = new char[len];
            System.out.println("len: " + len + " OK");
        } catch (Error e) {
            System.out.println("len: " + len + " " + e);
        }
    }
}

ओरेकल जावा 8 पर 92 प्रिंट अपडेट करें

len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483645 OK
len: 2147483644 OK

नोट: जावा 9 में, स्ट्रिंग्स बाइट का उपयोग करेगा [] जिसका अर्थ होगा कि मल्टी-बाइट वर्ण एक से अधिक बाइट का उपयोग करेगा और अधिकतम को कम करेगा। यदि आपके पास सभी चार बाइट कोड-पॉइंट हैं जैसे इमोजीस, तो आपको केवल लगभग 500 मिलियन अक्षर मिलेंगे


2
जावा 9 में कॉम्पैक्ट स्ट्रिंग्स या तो लैटिन -1 या यूटीएफ -16 एन्कोडिंग का उपयोग करते हैं। कोई वैरिएबल लंबाई एन्कोडिंग, यानी कोई तीन बाइट वर्ण नहीं।
अपंगिन

@apangin "UTF-8 जैसे वैकल्पिक एनकोडिंग का उपयोग करना लक्ष्य नहीं है" सुधार के लिए धन्यवाद।
पीटर लॉरी

5

क्या आपने अपनी संख्या रखने के BigDecimalबजाय उपयोग करने पर विचार किया है String?


1
यह इस बात पर निर्भर करता है कि आवेदन संख्या के साथ क्या करने जा रहा है। यदि यह केवल पाठ संबंधी चीजें करने जा रहा है जैसे कि palindromes, गिनती (दशमलव) अंक खोजना, तो एक स्ट्रिंग बेहतर है। यदि यह अंकगणित करने जा रहा है, तो एक BigDecimal (या BigInteger) बेहतर है।
स्टीफन सी।

समस्या यह है कि "प्रत्येक K के लिए, K की तुलना में सबसे छोटा पैलिंड्रोम का उत्पादन होता है" (जहाँ K दी गई संख्या है)। यह सामान्य रूप से सामान्य होगा कि के। की तुलना में पहला पैलिंड्रोम छोटा होगा। आपको के। की तुलना में एक बड़ा खोजने के लिए अंकगणित की आवश्यकता होती है। उदाहरण के लिए: अगले पलिंड्रोम को 9999999999 से बड़ा या 12922 से बड़ा अगला पैलिंड्रोम खोजें।
रावन एंडरसन

4

Integer.MAX_VALUE स्ट्रिंग का अधिकतम आकार है + आपकी मेमोरी के आकार पर निर्भर करता है, लेकिन क्षेत्र के ऑनलाइन न्यायाधीश पर समस्या आपको उन कार्यों का उपयोग करने की नहीं है


3

Java9 String.value को स्टोर करने के लिए बाइट [] का उपयोग करता है, इसलिए आप केवल Java9 में लगभग 1GB स्ट्रिंग्स प्राप्त कर सकते हैं। दूसरी ओर Java8 में 2GB स्ट्रिंग्स हो सकती हैं।

चरित्र से मेरा मतलब "चार" है, कुछ चरित्र बीएमपी (जैसे कुछ इमोजीस) में प्रतिनिधित्व करने योग्य नहीं है, इसलिए यह अधिक (वर्तमान में 2) चार्ट ले जाएगा।


4
क्या आप जावा -9 के लिए संदर्भ जोड़ सकते हैं स्ट्रिंग का आकार 2 जीबी से 1 जीबी तक सीमित
आदित्य गुप्ता

-1

ढेर हिस्सा खराब हो जाता है, मेरे दोस्तों। UTF-16 को 16 बिट तक सीमित होने की गारंटी नहीं है और यह 32 तक विस्तारित हो सकता है


2
सिवाय जावा के charप्रकार के 16 बिट्स बिलकुल सही हैं, इसलिए बिट्स की संख्या UTF-16 का उपयोग वास्तव में मायने नहीं रखता है ...
जाग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.